【发布时间】:2021-02-15 15:41:03
【问题描述】:
让我们考虑两个QObjects、senderObject 类型为SenderObject 和receiverObject 类型为ReceiverObject 的场景。 senderObject 已在工作线程上创建,而 receiverObject 已在主线程上创建。现在让我们假设SenderObject 有一个信号somethingsChanged,让我们考虑下面的代码sn-p:
片段1:
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread t;
SenderObject senderObject = new SenderObject();
senderObject.moveToThread(&t);
ReceiverObject receiverObject = new ReceiverObject();
//in this case we know for a fact that receiverObject's
//onSomethingsChanged() will be called on the main thread
QObject::connect(senderObject, &SenderObject::somethingsChanged,
receiverObject, &ReceiverObject::onSomethingsChanged, Qt::QueuedConnection);
t.start();
return a.exec();
}
现在让我们考虑以下代码 sn-p:
片段2:
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread t;
SenderObject senderObject = new SenderObject();
senderObject.moveToThread(&t);
//where will qDebug() << "Hello, world" be executed?
//On the main thread again since the lambda lives on the main thread?
QObject::connect(senderObject, &SenderObject::somethingsChanged,
[]{qDebug << "Hello, world";});
t.start();
return a.exec();
}
由于 lambda 已在主线程上声明,Snippet2 中的 lambda 是否也会在主线程上执行,还是会在与 senderObject 相同的线程中执行?
【问题讨论】:
标签: c++ multithreading qt qwidget qthread