所以我有一个有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文档,子分类不再是最佳的。
提前感谢。
答案 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()
将强制此函数完成,因此事件循环将没有要处理的事件并且线程将完成)