[英]Why connect `QThread::finished` signal to `QObject::deleteLater`?
[英]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.