多线程 – 为什么信号/插槽不能与多个线程一起工作?
发布时间:2020-12-15 08:45:36 所属栏目:Java 来源:网络整理
导读:class A : public QObject{ Q_OBJECTsignals: 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_OB
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)没有将计时器移动到线程,之后事情变得混乱. 将A的构造函数更改为: A() : _timer(this) {} 并且你的b_slot()将被调用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |