将GUI附加到命令行工具

时间:2014-05-12 09:18:55

标签: c++ user-interface ipc

我正在使用交互式命令行工具。该工具显示提示,用户可以输入正在处理的命令和参数。执行命令后,会出现一个新提示,用户可以继续输入命令。当在cli模式下使用时,它与gdb调试器非常相似。 该工具主要使用C ++编写,包含一些使用C库的包装器。

我想在我的工具上添加一个GUI(QT将是我的第一选择),但是,我不知道该怎么做。 如果您在互联网上搜索,许多Unix开发人员更愿意严格分离后端和前端。 所以,我正在考虑将GUI作为一个单独的可执行文件,它只使用我的命令行工具的功能。

实现这一目标的最佳方法是什么? 我应该使用管道或套接字进行过程间通信吗? 例如,gdb使用TCP / IP,甚至可以在与服务器不同的机器上运行GUI! (但是,此功能不是必需的。)

如果使用某种IPC,通讯应该如何工作?我应该使用ASCII接口(Unix编程的艺术更喜欢这个)?这样做的好处是我的GUI只需要解析命令行工具的输出。我不必非常改变我的工具,因为如果工具写入套接字/管道或只是为了cout它没有太大的区别。 如果是这样,我应该为IPC定义协议还是只解析输入/输出?

另一种方法是直接将GUI集成到我的工具中,从而只生成一个可执行文件。 Insight调试器就是这样做的。透视不仅仅是"使用" gdb,它的程序代码中有自己的gdb。 通过这种方式,我不必编写解析器,我的GUI代码只需从我的基本代码中调用函数即可。

或者我应该将命令行工具设为库,我可以将其与c​​li或GUI前端链接?

解决问题的最佳方法是什么? 上述解决方案的优势/劣势是什么? 你更喜欢什么?

1 个答案:

答案 0 :(得分:1)

正如您在问题中所提到的,有几种方法可以构建两个软件。你想问自己有三个问题:

  1. 两个代码段之间的关系是什么。
  2. 将来每个代码段的变化可能性有多大。
  3. 您的代码将如何部署
  4. 如果一个代码段严格地位于另一个层之上的抽象层(在您的情况下为CLI代码),则核心CLI功能相对成熟且稳定,而您发现GUI可能会经常更改,这可能建议您将CLI代码作为库,并使GUI代码包含库和"调用"到CLI代码。另一方面,如果GUI代码将一堆软件绑在一起,而CLI代码是一个更小,更孤立的模块,并且可能会以更高的频率发生变化(想想dvd播放器中的DVD)你可能会考虑使您的GUI成为导入不同引擎&CLI模块的框架。如果您希望这两个代码段具有并排关系,例如GUI可能会发出HTTP请求来下载图像,而CLI代码可能会在后台执行一些CPU密集型数字运算,那么您可能希望探索CLI和GUI作为单独的线程运行并与其他线程通信。 [根据两个代码段的紧密耦合程度,您可以探索单独的线程(无耦合),偶尔消息传递(消息队列)使用线程和细粒度锁(非常紧密耦合)。]

    在将大型软件部署分解为更小的模块化单元时,单独的进程(可选的套接字接口在不同的机器上运行)非常有用。只要您的代码仍然可以适应您的代码,并且大约不到大约10,000行代码,则增加的代码复杂性和延迟是不合理的。

    从您的描述中听起来好像CLI代码已经成熟,而GUI将只是一个与CLI交互的shell。我也明白你打算把你的代码作为可执行文件发送。因此,我认为您的用例符合使您的CLI代码成为库,并编写与其接口的CLI shell和GUI shell。