QThread finish() 信号永远不会发出

2024-03-08

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

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

工人阶级槽位:

void StartWork(){ 运行 = true; while(running){ 做工作; }}

void StopWork(){ 运行 = 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 运行时没有任何块等)。

但 thread->quit() 不执行任何操作,它被调用(因为按钮更改文本),但仅此而已。如果我只是调用worker->StopWork()它可以工作,但是我无法再次启动它。

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

提前致谢。


你有一个永远循环:

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

该函数将循环,因此线程的事件循环在发出后立即被阻塞started(). Thus, finished()无法发射。

解决方案一:

添加功能

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

到工人,并改变

void StartWork()
{
    running = true;
}

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

解决方案2:

改变功能

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

使用此解决方案,当工作线程停止其作业时,您将必须重新启动线程(StopWork()将强制此函数完成,因此事件循环将没有事件要处理,并且线程将完成)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QThread finish() 信号永远不会发出 的相关文章

随机推荐