Multithreading – why can’t signals / slots work with multiple threads?

class A : public QObject{
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();
}

I tried to understand why B was not called_ slot(). Anyone can explain what happened and why B was not called_ slot()?

Solution

The problem is class A_ Ownership of timer members

Because you do not explicitly initialize it, it initializes without a parent object So a. movetothread (& athread) didn't move the timer to the thread, and then things became chaotic

Change the constructor of a to:

A() : _timer(this) {}

And your b_ Slot () will be called

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>