14

在我的 Qt 应用程序中,我有一个主线程和一个工作线程。工作线程子类QThread化并通过customEvent. 这是主线程发送要由工作线程处理的事件的正确方式吗?

QThread* myWorkerThread = // ...

QApplication::instance()->postEvent (myWorkerThread, new MyWorkRequestEvent(/* ... */);

如果我正确阅读了文档,它会说明事件是在拥有事件接收者的对象的线程上处理的。由于QThread是由主线程创建的,它归主线程所有——所以这个事件会由主线程处理(这会违反直觉,在我的情况下是错误的)?

4

2 回答 2

16

你的理解是正确的,确实很不直观:)

很多麻烦来自于 QThread 的文档,该文档建议子类化 QThread。尽管 Qthread 有自己的事件循环,但只有在 run() 方法中创建的 QObjects(在该线程中创建)的事件和信号才会在 QThread 事件循环中处理。

最好将线程逻辑封装在 QObject 子类中,然后将该对象移动到普通 QThread 的实例中。然后,您可以使用信号(将跨线程边界正确排队)或自定义事件与该 QObject 通信。

在这个类似的问题中有一些链接应该会有所帮助。

于 2011-06-01T22:51:04.310 回答
-1

QApplication事件由位于or中的主事件循环处理QCoreApplication。所以将事件发送到其他线程是没有意义的QObjects(除非你在那里创建另一个我不确定是否可能的事件循环)。

不过,您可以将来自其他线程的事件发送到您的主线程。您的myWorkerThread示例中的 由主线程拥有,因为它是在那里创建的。由您的工作线程run()及其下方创建的对象归该线程所有。

您还可以向其他线程中的插槽发送信号,例如,如果您想从您的工作线程或类似线程中绘制一个小部件(必须在主线程中完成)。

于 2011-06-01T22:33:24.010 回答