我有这个功能来更新一些 GUI 的东西:
void SavedConnections::renderList()
{
// Do GUI stuff! Must run in Qt thread!!!
...
}
我需要确保该函数不会从其他线程调用。我打算做的是将其推迟到事件循环中并发出警告:
void SavedConnections::renderList()
{
if(!this_thread_is_Qt_GUI_thread()) {
qDebug()<< "Warning: GUI operation attempted from non GUI thread!\n";
QCoreApplication::postEvent(this, new UpdateGUIEvent());
return;
}
// Do GUI stuff! Must run in Qt thread!!!
...
}
这种模式也非常方便地创建保证在 GUI 线程中异步运行的方法,而无需任何丑陋的语法。我已经问过关于 Java 的 ExecutorService 的类似问题 https://stackoverflow.com/q/34798891/607407.
您可以检查当前线程是否是您的对象所在的线程:
if (QThread::currentThread() != this->thread()) {
// Called from different thread
}
注意这可能不是主要的 GUI 线程!这是线程this
住在(见QObject 线程亲和性) http://doc.qt.io/qt-5/qobject.html#thread-affinity。如果你不改变它使用QObject::moveToThread
,它是创建对象的线程。
这也是QCoreApplication::postEvent
用于确定应将事件发布到哪个线程。目标线程必须运行QEventLoop
响应该事件。
因此检查主 GUI 线程(qApp->thread()
),但张贴到this
如果您的对象不在主 GUI 线程中,则 的线程可能无法工作。然而,如果你在那里做 GUI 的事情,它无论如何都应该存在于 GUI 线程中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)