Qt4与UI线程连接

时间:2012-11-11 16:01:53

标签: c++ qt4

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

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

我一直在查看文档并且无法决定(或者真正看到)在我的实例中更新UI的最有用的方法 - 我应该创建一个继承自QThread并运行它的类吗?使用QFuture和QtConcurrent进行一些技巧,创建一个自定义结构并将其填充到UI线程,使用customEvent(),还是总体上有更好的方法?代码易读性和性能是最高要求。

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

只有一个类(目前,它继承了QObject并提供信号+插槽功能),我用它来运行QEClication上的exec,还保存服务器,通道,用户的创建功能,等

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

最简单的方法是使用SIGNAL / SLOT机制。您的主线程应连接到解析器的信号。在解析器中准备好数据后,只需发出一个包含您选择使用的数据结构的信号。数据结构只是适合您传输数据的需求。只是一个结构或任何你想要的。