繁体   English   中英

QThread finish()信号从不发出

[英]QThread finished() signal is never emited

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

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

工人舱位:

void StartWork(){running = true; (正在运行){ }}

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运行时没有任何块,等等)。

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

我已经尝试过thread-> exit(); 但是结果是一样的。 我也知道子分类的工作原理,但是看起来比较丑陋,根据最近的Qt文档,子分类不再是最优的。

提前致谢。

你有一个永远的循环:

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

此函数将循环执行,因此线程的事件循环在发出started()之后立即被阻塞。 因此,不能发射finished()

解决方案1:

添加功能

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

给工人,改变

void StartWork()
{
    running = true;
}

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

解决方案2:

改变功能

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM