在线程对象上调用 quit() 或 exit() 将简单地结束线程的事件循环(如果有任何运行)。但是正如您正确指出的那样,最初的问题仍然存在。如果工作函数已经被事件循环执行并且是一个具有永久构造的长时间运行函数怎么办。对 quit() 或 exit() 的调用将简单地等待工作函数返回。
除了使调用者可以使用公共函数以更改内部标志之外,还可以建议几种方法。
signals:
void signalTermination();
public slots:
void setTerminationFlag();
private:
QMutex mutex;
bool terminationRequested;
你的插槽看起来像东西。
void setTerminationFlag()
{
QMutexLocker locker(&mutex);
terminationRequested = true;
}
然后,您可以在永远循环的每次迭代中检查 doWork 函数中的变量。
mutex.lock();
if(terminationRequested)
{
//break from loop and effectively doWork function
}
mutex.unlock();
使用信号和槽而不是普通成员函数的原因之一是,如果您的工作函数在同步代码块内执行一些长时间运行的任务,则公共函数将保持阻塞状态,直到它访问同步对象。如果您的公共终止方法的调用线程是 UI 线程,这可能会产生不利影响。
- 如果您使用 Qt 5.2 及更高版本,则另一种干净且更简单的方法
使用 QThread 的 requestInterruption() 方法。此方法在线程对象中设置一个咨询标志,您可以通过 doWork() 函数中的 isInterruptionRequested() 函数调用来检查它。请参阅QThread::isInterruptionRequested文档中给出的以下代码片段。
void long_task() {
forever {
if ( QThread::currentThread()->isInterruptionRequested() ) {
return;
}
}
}
你也可以在这里直接调用quit()来结束线程的事件循环。