C++ 将信号连接到lambda时Qt::QueuedConnection和Qt::DirectConnection之间的差异 让我们考虑两种情况:代码< QObjs > SeordObjult >代码> > SeordObjult< /C>和接收对象< /代码>类型接收对象< /代码>。code>senderObject已在工作线程上创建,而receiverObject已在主线程上创建。现在让我们来看看代码> SeordObjult有一个信号一些改变了< /代码>,让我们考虑下面的代码片段:
代码片段1:C++ 将信号连接到lambda时Qt::QueuedConnection和Qt::DirectConnection之间的差异 让我们考虑两种情况:代码< QObjs > SeordObjult >代码> > SeordObjult< /C>和接收对象< /代码>类型接收对象< /代码>。code>senderObject已在工作线程上创建,而receiverObject已在主线程上创建。现在让我们来看看代码> SeordObjult有一个信号一些改变了< /代码>,让我们考虑下面的代码片段:,c++,multithreading,qt,qwidget,qthread,C++,Multithreading,Qt,Qwidget,Qthread,代码片段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 w
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();
}
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();
}
现在让我们考虑下面的代码片段:
代码片段2: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();
}
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();
}
intmain(intargc,char*argv[]){
qcorea应用程序(argc、argv);
qt线程;
SenderObject SenderObject=新的SenderObject();
senderObject.moveToThread(&t);
//qDebug()将在何处这是我们的类SenderObject:
class Sender : public QObject {
Q_OBJECT
public:
explicit Sender() : QObject() {
_timer.setInterval(1000);
connect(&_timer, &QTimer::timeout, this,
[this] { emit somethingsChanged(); });
_timer.start();
}
signals:
void somethingsChanged();
private:
QTimer _timer;
};
由于不存在采用lambda和Qt
连接类型参数的QObject::connect
重载,因此Snippet2将在发送方线程(工作线程)中执行
为了强制lambda在主线程上执行,这里有一个解决方法:
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread t;
SenderObject senderObject = new SenderObject();
senderObject.moveToThread(&t);
QObject::connect(senderObject, &SenderObject::somethingsChanged, new QObject,
[]{qDebug << "Hello, world";}, Qt::QueuedConnection);
t.start();
return a.exec();
}
或者,更好的解决方案是使用qApp
,它是应用程序的一个实例和一个单例,可以在任何地方使用
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread t;
SenderObject senderObject = new SenderObject();
senderObject.moveToThread(&t);
QObject::connect(senderObject, &SenderObject::somethingsChanged, qApp,
[]{qDebug << "Hello, world";}, Qt::QueuedConnection);
t.start();
return a.exec();
}
intmain(intargc,char*argv[]){
qcorea应用程序(argc、argv);
qt线程;
SenderObject SenderObject=新的SenderObject();
senderObject.moveToThread(&t);
QObject::connect(senderObject和senderObject::somethingsChanged、qApp、,
[]{qDebug这是我们的类SenderObject:
class Sender : public QObject {
Q_OBJECT
public:
explicit Sender() : QObject() {
_timer.setInterval(1000);
connect(&_timer, &QTimer::timeout, this,
[this] { emit somethingsChanged(); });
_timer.start();
}
signals:
void somethingsChanged();
private:
QTimer _timer;
};
由于不存在采用lambda和Qt
连接类型参数的QObject::connect
重载,因此Snippet2将在发送方线程(工作线程)中执行
为了强制lambda在主线程上执行,这里有一个解决方法:
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread t;
SenderObject senderObject = new SenderObject();
senderObject.moveToThread(&t);
QObject::connect(senderObject, &SenderObject::somethingsChanged, new QObject,
[]{qDebug << "Hello, world";}, Qt::QueuedConnection);
t.start();
return a.exec();
}
或者,更好的解决方案是使用qApp
,它是应用程序的一个实例和一个单例,可以在任何地方使用
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThread t;
SenderObject senderObject = new SenderObject();
senderObject.moveToThread(&t);
QObject::connect(senderObject, &SenderObject::somethingsChanged, qApp,
[]{qDebug << "Hello, world";}, Qt::QueuedConnection);
t.start();
return a.exec();
}
intmain(intargc,char*argv[]){
qcorea应用程序(argc、argv);
qt线程;
SenderObject SenderObject=新的SenderObject();
senderObject.moveToThread(&t);
QObject::connect(senderObject和senderObject::somethingsChanged、qApp、,
[]{qDebug