gpt4 book ai didi

c++ - QThread finished() 信号永远不会发出

转载 作者:搜寻专家 更新时间:2023-10-31 00:41:36 26 4
gpt4 key购买 nike

所以我有一个工作类,它有 2 个槽:StartWork() 和 StopWork(),StartWork() 运行一个无限循环(它只是不停地读取和读取相机输入),而 StopWork() 方法只是将 bool 变量设置为 false(因此 StartWork() 中的循环停止)。

根据 QThread 文档,现在使用它们的最佳方法不是通过子类化,而是通过将工作线程移动到线程中,这就是我所做的。问题是,来自线程的 started() 信号被调用,但 finished() 信号从未被调用。

worker 类(Class)槽:

void StartWork(){ running = true; while(running){ do work; }}

void StopWork(){ running = false; }

QThread初始化和信号/槽连接:

thread = new QThread();
worker = new Worker();
worker.moveToThread(thread);

QObject::connect(thread, SIGNAL(started()), worker, SLOT(StartWork()));
QObject::connect(thread, SIGNAL(finished()), worker, SLOT(StopWork()));

在我的 QPushButton 上我这样做:

if(pushStartStop->text().toLower() == "start")
{
pushStartStop->setText("Stop");
thread->start();
}
else
{
pushStartStop->setText("Start");
thread->quit();
}

thread->start() 工作正常,StartWork() 被调用,一切都很漂亮(GUI 运行时没有 block 等)。

但是 thread->quit() 什么都不做,它被调用(因为按钮改变了文本),仅此而已。如果我只是调用 worker->StopWork() 它会起作用,但我无法再次启动它。

我试过 thread->exit();但结果是一样的。我也知道子类化有效,但它看起来更丑陋,根据最近的 Qt 文档,子类化不再是最佳的。

提前致谢。

最佳答案

你有一个永远的循环:

void StartWork()
{
running = true;
while(running)
{
do work;
}
}

这个函数会循环,所以线程的事件循环在发出 started() 之后就被阻塞了。因此,无法发出 finished()

解决方案一:

添加函数

void DoWork()
{
if(running)
{
do work
}
}

给Worker,并改变

void StartWork()
{
running = true;
}

然后,只需将 DoWork 连接到线程中的计时器即可。

解决方案 2:

改变功能

void StartWork()
{
running = true;
while(running)
{
do work;
QCoreApplication::processEvents();
}
}

使用此解决方案,您将不得不在工作人员停止工作时重新启动线程(StopWork() 将强制此函数完成,因此事件循环将没有要处理的事件,并且线程将完成)。

关于c++ - QThread finished() 信号永远不会发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12942461/

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