gpt4 book ai didi

c++ - Qt 的多线程信号和槽行为问题

转载 作者:行者123 更新时间:2023-11-30 02:54:53 26 4
gpt4 key购买 nike

我目前正在尝试了解 Qt 中的信号和槽如何处理线程。

我尝试使用以下代码运行一个小测试:

class Worker : public QObject{
Q_OBJECT
public:
Worker(int _value){value = _value;}
~Worker(){};
int value;

public slots:
void changeValue(int newValue){value = newValue;}
void doWork(){
while(1){
_sleep(500);
std::cout << "Value is " << value << std::endl;
if(value == 0)break;
}
emit finished();
}

signals:
void finished();
};

class Manager : public QObject{
Q_OBJECT
public:
Manager(){}
~Manager(){};
signals:
void modifiedValue(int value);
public:
void changeTheValue(int value){emit modifiedValue(value);}
};

基本上,worker 每隔一段时间显示它的 value 成员,并且有一个带有修改值的函数的插槽。

管理器的唯一目的是在调用 changeTheValue 时发出具有新值的信号,该信号映射到修改 value 成员的 Worker 中的插槽。

然后我让我的 Worker 类按以下方式在线程中工作:

QThread myThread;
Worker myWorker(10);
Manager manager;

myWorker.moveToThread(&myThread);
QObject::connect(&myThread, SIGNAL(started()), &myWorker,SLOT(doWork()));
QObject::connect(&myWorker, SIGNAL(finished()), &myThread, SLOT(quit()));
QObject::connect(&myWorker, SIGNAL(finished()), &myWorker, SLOT(deleteLater()));
QObject::connect(&myThread, SIGNAL(finished()), &myThread, SLOT(deleteLater()));
QObject::connect(&manager, SIGNAL(modifiedValue(int)),
&myWorker, SLOT(changeValue(int)));
myThread.start();

for(int i = 1; i < 10 ; i++){
_sleep(1000);
manager.changeTheValue(i);
}
manager.changeTheValue(0);

但是没有任何反应。该值似乎没有改变:输出显示十几行 Value is 10

我不明白的是,为什么与 Manager::modifiedValueWorker::changeValue 的信号/插槽映射似乎不起作用?仅仅是因为线程当前正在运行 doWork() 的循环吗?那么对插槽的调用在哪里结束(排队,丢弃,其他)?

我找不到更多关于信号/槽机制如何与线程一起工作的信息(我只找到了 this thread,它解释了在哪个线程的调用堆栈中调用槽结束,但是答案似乎已过时并导致 Qt 5 主页)。

总结问题:

  • 为什么调用修改值的槽没有任何作用?
  • 是否有可能使这项工作(在必要时添加线程安全)以及如何实现?

最佳答案

信号和槽如何与线程一起工作有多种模式(您绝对必须使用 QThread 才能使它们工作!)。这些记录在手册中: http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads

您的代码中的错误是从未调用 Qt 事件循环(因为 doWork 永远不会返回)。对于重复调用,您应该在该线程中使用计时器。或者(不推荐的解决方案)您可以在无限循环中调用 processEvents

关于c++ - Qt 的多线程信号和槽行为问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16774748/

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