问:正确的方式将事件发布到QThread?

Ton*_*ony 13 c++ events qt multithreading qthread

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

QThread* myWorkerThread = // ...

QApplication::instance()->postEvent (myWorkerThread, new MyWorkRequestEvent(/* ... */);
Run Code Online (Sandbox Code Playgroud)

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

Arn*_*nce 15

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

很多麻烦来自QThread的文档,它建议继承QThread.虽然Qthread有自己的事件循环,但只有在run()方法中创建的QObject的事件和信号(在该线程中创建)才会在QThread事件循环中处理.

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

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

  • 第3段+1:让我们分散正确的线程方式 (4认同)