加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程 – 为什么信号/插槽不能与多个线程一起工作?

发布时间: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()将被调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读