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.作者投稿可能会经我们编辑修改或补充。