QThread的结束()信号也决不emited(QThread finished() signal

2019-09-24 06:19发布

所以我有具有2个时隙的工人类:StartWork()和限紧()时,StartWork()一个运行的无限循环(它只是读取和读取照相机输入非停止)和限紧()方法只设置一个布尔变量设置为false(所以内部StartWork()停止循环)。

根据QThread的文档,现在使用它们的最好办法是不是子类,而是由移动人员进入线程,所以这就是我做什么。 问题是,从线程开始()信号被调用,但成品()信号不会被调用。

工人阶级插槽:

无效StartWork(){运行= TRUE; 而(运行){做的工作; }}

空隙限紧(){运行= 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->退出()不会做任何事情,它被调用(因为按钮改变文本),但多数民众赞成它。 如果我只是叫工人─>限紧()它的工作原理,但我就不能再次启动它。

我试着thread->退出(); 但结果是一样的。 此外,我知道子类的作品,但它看起来丑陋,并根据最近的Qt文档,子类化不再是最优的。

提前致谢。

Answer 1:

你拥有了一个真正的循环:

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()将迫使这个函数来完成,所以事件循环将没有事件处理和线程将完成)。



文章来源: QThread finished() signal is never emited
标签: c++ qt qthread