从另一个线程唤醒QThread :: exec()

时间:2014-06-03 20:09:29

标签: c++ multithreading qt qthread qtcore

考虑从QThread派生的 MyThread ,并像这样实现它的run()例程

void MyThread::run() {
  QThread::exec();
}

或等效

void MyThread::run() {
  QEventLoop eventLoop(this);
  eventLoop.exec();
}

在这种状态下,如何导致“执行”操作。通过另一个线程中的某些操作返回?

考虑相反的情况:没有轮询,如何将一个事件从线程发回主线程?

显然,从线程发出的信号在同一个线程中处理。

2 个答案:

答案 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)