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

Wake up QThread::exec() from another thread

本文关键字:exec QThread 另一个 线程 唤醒      更新时间:2023-10-16

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

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

或者

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

在这种状态下,如何通过另一个线程中的某些操作导致'exec'返回?

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

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

您似乎对QThreads应该如何工作有一些误解。不幸的是,你并不孤单。

首先要做的是阅读这里的正确用法:

如何真正地使用QThreads;完整的解释

那么,你应该这样写:

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,反之亦然。

QEventLoop有一个可以调用的插槽quit。如果在mythread中放置了对eventloop的引用,那么就可以使用它来调用slot。

信号/槽可以跨线程方式使用。更多信息在这里:跨线程的信号和槽

QMetaObject::invokeMethod( eventloop, "quit", Qt::QueuedConnection)