将 GUI 附加到命令行工具
Posted
技术标签:
【中文标题】将 GUI 附加到命令行工具【英文标题】:attach a GUI to a command line tool 【发布时间】:2014-05-12 09:18:54 【问题描述】:我正在开发一个交互式命令行工具。该工具显示一个提示,用户可以输入正在处理的命令和参数。执行命令后,会有一个新提示,用户可以继续输入命令。在 cli 模式下使用时,它与 gdb 调试器非常相似。 该工具主要是用 C++ 编写的,带有一些用于使用 C 库的包装器。
我想在我的工具上附加一个 GUI(QT 将是我的首选),但是我不确定如何执行此操作。 如果您在 Internet 上搜索,许多 Unix 开发人员更喜欢严格分离后端和前端。 所以,我正在考虑让 GUI 成为一个单独的可执行文件,它只使用我的命令行工具的功能。
实现这一目标的最佳方法是什么? 我应该使用管道或套接字的进程间通信吗? 例如,gdb 使用 TCP/IP,甚至允许在与服务器不同的机器上运行 GUI! (但是,此功能不是必需的)。
如果使用某种 IPC,通信应该如何工作?我应该使用 ASCII 接口吗(Unix 编程的艺术更喜欢这个)?这样做的好处是我的 GUI 只需要解析我的命令行工具的输出。我不必对我的工具进行太多更改,因为如果该工具写入套接字/管道或只是写入 cout 并没有太大区别。 如果是这样,我应该为 IPC 定义一个协议还是只解析输入/输出?
另一种方法是将 GUI 直接集成到我的工具中,从而只生成一个可执行文件。 Insight 调试器就是这样做的。 Insight 不仅“使用”gdb,它的程序代码中还有自己的 gdb。 这样我就不必编写解析器了,我的 GUI 代码可以从我的“基本代码”中调用函数。
或者我应该让我的命令行工具成为一个库,我可以将它与 cli 或 GUI 前端链接?
解决我的问题的最佳方法是什么? 上述解决方案的优点/缺点是什么? 你喜欢什么?
【问题讨论】:
“或者我应该让我的命令行工具成为一个库,我可以将它与 cli 或 GUI 前端链接?”是的 - 这将表现得更好,避免潜在的缓慢和/或内存消耗的序列化和反序列化,类型安全并避免大量编码。 【参考方案1】:正如您在问题中提到的,您可以通过多种方式构建两个软件。您想问自己三个问题:
-
这两个代码段之间的关系是什么。
每个代码段在未来发生变化的可能性有多大。
您的代码将如何部署
如果一个代码段严格来说是另一层之上的抽象层(在您的案例中是 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。
【讨论】:
以上是关于将 GUI 附加到命令行工具的主要内容,如果未能解决你的问题,请参考以下文章