从另一个线程唤醒QThread::exec()
Wake up QThread::exec() from another thread
考虑从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)
相关文章:
- 如何监控QThread
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 等待 qthread 终止的正确方法是什么?
- 如何正确停止运行非循环QThread?
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- Qt/SQL - 从 QSqlQuery exec Stored Procedure 获取列类型和名称?
- Valgrind 在 QThread::start() 上报告内存泄漏
- 如何在 QThread 中传递引用
- 使用 QTimer、QThread 和进度条
- 为什么我不能调用 QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection)?
- Python 的 exec() 函数的 C++ 版本
- 为什么使用 exec() 重新启动程序不能正常工作?
- 如何将参数包装在 C 或 C++ 中并将它们传递给系统或 exec*
- QThread::create 似乎没有将参数传递给函数
- 使用MSVC编译的Qt程序在app.exec()上崩溃
- -bash:/a.out:无法执行二进制文件:Exec格式错误
- QThread::create running on UI Thread
- 无法使用管道将数据发送到我通过exec(C++)启动的第二个应用程序
- std::condition_variable 在 QThread::run() 中的用法
- 从另一个线程唤醒QThread::exec()