QT的线程创建和使用都非常方便,其中一种方法就是直接继承QThread类,重写run()方法即可实现将任务置于线程中执行。之前使用一直没有问题,前段时间在使用的过程中遇到一种情况:需要多次传递不同的参数调用start()函数,让线程中的任务重复执行,多次调用是依次进行的,因此我仅创建了一个线程对象。每次run()运行完以后,直接传递新的参数,让该线程重新执行run()里面的任务函数。
此时出现了一个问题:第一次调用start()函数,并且run()函数中的任务执行完以后,我传递参数重新调用start()函数时,第2次调用该线程并没有正常启动并执行。而且,从代码单步进度来看run()函数已经执行完毕。产生该问题的主要原因是:同一个线程对象的start()若同一时间被调用多次,若第1次线程调用线程还未退出的情况下,则第2~N次被QT自动给拦截了。线程的退出不能以run()函数执行完毕为判断条件,得以线程的isFinished()函数作为判断条件。
QThread* pThread = new QThread(this);
pThread->start(); // 第一次调用,正常启动线程函数
pThread->start(); // 在第一次调用线程还未结束条件下,直接第二次调用,则本次调用失效
再次调用QThread的start()函数之前,一定要经过判断该线程已经结束运行了。
while (m_thread->isFinished() == false)
{
QThread::sleep(