gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:08:13 25 4
gpt4 key购买 nike

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() 将被调用。

关于multithreading - 为什么信号/槽不适用于多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8285107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com