考虑从QThread派生的 MyThread ,并像这样实现它的run()例程
void MyThread::run() {
QThread::exec();
}
或等效
void MyThread::run() {
QEventLoop eventLoop(this);
eventLoop.exec();
}
在这种状态下,如何导致“执行”操作。通过另一个线程中的某些操作返回?
考虑相反的情况:没有轮询,如何将一个事件从线程发回主线程?
显然,从线程发出的信号在同一个线程中处理。
答案 0 :(得分:2)
您似乎对QThreads应该如何工作有一些误解。不幸的是,你并不孤单。
要做的第一件事是在这里阅读正确的用法:
How To Really, Truly Use QThreads; The Full Explanation
所以,你应该写的是这样的:
QThread* thread1 = new QThread;
QThread* thread2 = new QThread;
Task1* task1 = new Task1();
task1->moveToThread(thread1);
Task2* task2 = new Task2();
task2->moveToThread(thread2);
connect(task2, SIGNAL(finished()), thread1, SLOT(quit()));
connect(thread2, SIGNAL(started()), task2, SLOT(process()));
thread1->start();
thread2->start();
正如您所看到的,我正在使用quit()插槽,就像前面提到的示例一样。您需要在task2中使用emit finished()
,尝试终止thread1,反之亦然。
答案 1 :(得分:1)
QEventLoop有一个可以调用的插槽quit
。如果您在mythread中添加对eventloop的引用,则可以使用它来调用插槽。
信号/插槽可以以跨线程方式使用。更多信息请访问:Signals and Slots Across Threads
QMetaObject::invokeMethod( eventloop, "quit", Qt::QueuedConnection)