gpt4 book ai didi

c++ - 将 GUI 附加到命令行工具

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:19 26 4
gpt4 key购买 nike

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

我想为我的工具附加一个 GUI(QT 是我的首选),但是,我不确定如何执行此操作。如果您在互联网上搜索,许多 Unix 开发人员更喜欢将后端和前端严格分开。因此,我正在考虑将 GUI 制作成一个单独的可执行文件,它只使用我的命令行工具的功能。

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

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

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

或者我应该让我的命令行工具成为一个库,我可以将它与 cli 或 GUI 前端链接?

解决我的问题的最佳方法是什么?上述解决方案的优点/缺点是什么?你喜欢什么?

最佳答案

正如您在问题中指出的那样,您可以通过多种方式构建两个软件。你想问自己三个问题:

  1. 两个代码段之间的关系是什么。
  2. 每个代码段将来发生变化的可能性有多大。
  3. 您的代码将如何部署

如果一个代码段严格来说是另一层之上的抽象层(在您的案例中是 CLI 代码),则核心 CLI 功能相对成熟和稳定,而您发现 GUI 可能会经常更改,这可能建议您将 CLI 代码设为一个库,并让 GUI 代码包含该库并“向下调用”CLI 代码。另一方面,如果 GUI 代码将一堆软件连接在一起,而 CLI 代码是一个更小、更独立的模块,并且可能会以更高的频率变化(想想 dvd 播放器中的 dvd),您可能会考虑使您的 GUI 成为导入不同“引擎”或 CLI 模块的框架。如果您希望这两个代码段具有并排关系,例如,GUI 可能会发出 HTTP 请求来下载图像,而 CLI 代码可能会在后台执行一些 CPU 密集型数字运算,那么您可能想要探索具有CLI 和 GUI 都作为单独的线程运行并相互通信。 [根据两个代码段的紧密耦合程度,您可以探索单独的线程(无耦合)、偶尔的消息传递(消息队列)以使用线程和细粒度锁(非常紧密耦合)。]

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

从您的描述来看,CLI 代码似乎已经成熟,GUI 将只是一个与 CLI 交互的外壳。我还了解到您打算将您的代码作为可执行文件发布。因此,我认为您的用例符合使您的 CLI 代码成为一个库,并编写与其交互的 CLI shell 和 GUI shell。

关于c++ - 将 GUI 附加到命令行工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23605244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com