multithreading之为什么信号/槽不适用于多线程

bhlsheji 阅读:36 2024-08-28 10:21:53 评论:0

class A : public QObject{ 
 
  Q_OBJECT 
 
signals: 
  void a_sig(); 
 
public: 
  A(){ } 
 
public slots: 
  void begin(){ 
    QObject::connect(&_timer, SIGNAL(timeout()), this, SIGNAL(a_sig())); 
    _timer.start(1000);  
  } 
 
private: 
  QTimer _timer; 
}; 
 
 
class B : public QObject{ 
 
  Q_OBJECT 
 
public: 
  B(){ value = 0; } 
 
public slots: 
  void b_slot(){ 
 
    ++value; 
    QFile file("out.txt"); 
    file.open(QIODevice::WriteOnly); 
    QTextStream out(&file); 
    out << value << "\n"; 
    file.close(); 
  } 
 
private: 
  int value; 
}; 
 
int main(int argc, char **argv){ 
 
  QCoreApplication app(argc, argv); 
 
  A a; 
  B b; 
  QThread aThread; 
  QThread bThread; 
 
  QObject::connect(&aThread, SIGNAL(started()), &a, SLOT(begin())); 
  QObject::connect(&a, SIGNAL(a_sig()), &b, SLOT(b_slot())); 
 
  a.moveToThread(&aThread); 
  b.moveToThread(&bThread); 
 
  aThread.start(); 
  bThread.start(); 
 
  return app.exec(); 
} 

我想了解为什么 b_slot() 没有被调用。谁能解释发生了什么,为什么 b_slot() 没有被调用?

请您参考如下方法:

问题是 A 类的 _timer 成员的所有权。

因为您没有显式初始化它,所以它在没有父对象的情况下被初始化。所以 a.moveToThread(&aThread) 没有将计时器移动到 aThread,之后事情就变得困惑了。

A 的构造函数更改为:

A() : _timer(this) {} 

您的 b_slot() 将被调用。


标签:多线程
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号