QT线程QThread多次调用start()函数出现第2次调用失败问题备忘

        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(100);
  }
  thread->start();

  或者
  if (m_lst_thread[nThread]->isFinished() == false)
  {
    m_lst_thread[nThread]->exit();
  }
  Thread->start();

          阿科

        2017年5月13日于HPU计算机科学与技术学院303室

        有问题欢迎一起讨论学习

        QQ:33845995

        Email:[email protected]


    

你可能感兴趣的:(QT)