Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将信号连接到lambda时Qt::QueuedConnection和Qt::DirectConnection之间的差异 让我们考虑两种情况:代码< QObjs > SeordObjult >代码> > SeordObjult< /C>和接收对象< /代码>类型接收对象< /代码>。code>senderObject已在工作线程上创建,而receiverObject已在主线程上创建。现在让我们来看看代码> SeordObjult有一个信号一些改变了< /代码>,让我们考虑下面的代码片段:_C++_Multithreading_Qt_Qwidget_Qthread - Fatal编程技术网

C++ 将信号连接到lambda时Qt::QueuedConnection和Qt::DirectConnection之间的差异 让我们考虑两种情况:代码< QObjs > SeordObjult >代码> > SeordObjult< /C>和接收对象< /代码>类型接收对象< /代码>。code>senderObject已在工作线程上创建,而receiverObject已在主线程上创建。现在让我们来看看代码> SeordObjult有一个信号一些改变了< /代码>,让我们考虑下面的代码片段:

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

代码片段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();
}
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