QThread完成()信号永远不会发出

时间:2012-10-17 20:05:05

标签: c++ qt qthread

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

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

工人类位:

  

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文档,子分类不再是最佳的。

提前感谢。

1 个答案:

答案 0 :(得分:5)

你有一个永远的循环:

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()将强制此函数完成,因此事件循环将没有要处理的事件并且线程将完成)