0

我有一个 CLI 应用程序,我正在扩展它以提供一个用户界面来帮助提高可用性,并且正在使用 Qt-4.8.3。

应用程序连接到 IRC 服务器,每个连接都驻留在自己的线程中接收数据。解析器在不同的线程中运行,然后处理数据并做出相应的反应——创建通道、添加用户等。

我一直在查看文档,只是无法决定(或真正看到)在我的实例中更新 UI 最有用的方法是什么——我是否应该创建一个从 QThread 继承的类并运行它,做一些诡计QFuture 和 QtConcurrent,创建一个自定义结构并将其填充到 UI 线程,使用 customEvent(),还是有更好的方法?代码的易读性和性能是最高要求。

我目前拥有的代码运行完美,但在解析器线程中自然地创建一个新的 QWidget 会立即中断,并通知它不是 UI 线程。

只有一个类(目前,它继承 QObject 并提供信号 + 插槽功能)用于在 QApplication 上运行 exec,并且还包含服务器、通道、用户等的创建函数。

如果需要,我可以发布一些代码,但是代码很多,我不确定它是否真的相关。

4

2 回答 2

4

执行此操作的规范方法是创建 QObject/QThread 对(或多个 QObject 和单个 QThread,如果您希望多个函数在同一个线程中运行。)您不是继承 QThread,而是继承 QObject,创建一个 QThread 并移动您的该线程的 QObject 子类实例,带有moveToThread(). QThread 的预期用途是作为操作系统线程功能的接口,而不是作为运行代码的容器。(见http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation)。

当然,所有与 GUI 的通信都必须使用信号和插槽进行。

于 2012-11-11T16:13:13.800 回答
0

这种情况听起来很常见。它只是将处理后的数据从线程转发到主线程以进行 UI 更新的基本解决方案。

The easiest way to do it is to just make use of the SIGNAL/SLOT mechanism. Your main thread should be connected to signals from your parser. When data is ready in your parser, just emit a signal with the data structure that you choose to use. The data structure is simply whatever suits your needs for communicating the data. Just a struct or whatever you want.

于 2012-11-11T16:13:43.347 回答