1.启动
void run(){
while (!thread->isInterruptionRequested()) {
QMutexLocker lock(&m_mutex);
// to do something
msleep(200);
}
}
采用isInterruptionRequested()方法控制线程是否停止,该方法只有qt5才具备;采用锁m_mutex来决定线程是否暂停。用一个while循环使子线程一直处于运行状态。
如果该线程上运行的任务应该停止,则返回true。可以通过requestinterrupt()请求中断。
此函数可用于使长时间运行的任务完全可中断。不检查或操作这个函数返回的值是安全的,但是建议在长时间运行的函数中定期这样做。注意不要过于频繁地调用它,以保持较低的开销。
2.暂停
void pause()
{
m_mutex.lock();
}
m_mutex.lock();语句用于获取锁,不一定会在调用pause方法的时候立即暂停线程,可能是稍后暂停线程,这主要取决于何时调用pause方法的线程取得该锁。取得该锁后,循环的子线程将因为得不到锁而处于暂停状态。
3.继续
void resume()
{
m_mutex.unlock();
}
调用resume()方法的线程释放锁,循环中的子线程将因为获得锁而继续循环运行。
4.结束线程
void exitThread()
{
thread->requestInterruption();
thread->wait();
delete thread;
}
//结束线程
//thread->quit();
//thread->wait();
//delete thread;
//调用quit方法结束事件循环,即退出了exec()这个死循环,这样,就可以执行run方法中的return方法了,退出run。调用wait();方法是为了确保子线程退出了,已防止在未完全停止子线程的情况下delete而引发crash。
调用requestInterruption方法去请求停止线程,requestInterruption的实现机制实际上是通过互斥锁+标识变量的方式来实现的,通过维护标示变量来指定线程是否运行,循环的子线程将通过isInterruptionRequested()方法判断是否接收到暂停请求,如果接收到,则退出循环,也就意味着线程结束了。但线程的结束并不是立刻进行的,可能是稍后发生的,如果在线程还未停止前调用了delete方法,会引发crash,所以,在delete之前加一句wait();这句话的意思是等待线程完全停止,然后再去delete。