QTスレッドQThreadマルチコールstart()関数2回目のコール失敗問題が発生しました.

1224 ワード

QTのスレッドの作成と使用は非常に便利で、その1つの方法は直接QThreadクラスを継承し、run()メソッドを書き換えることで、タスクをスレッドに配置して実行することができます.以前は問題なく使用していましたが、この間、使用中に異なるパラメータ呼び出しstart()関数を複数回渡す必要があり、スレッド内のタスクを繰り返し実行させ、複数回呼び出しが順次行われるため、スレッドオブジェクトを1つだけ作成しました.run()の実行が完了するたびに、新しいパラメータを直接渡し、そのスレッドにrun()内のタスク関数を再実行させます.
最初にstart()関数を呼び出し、run()関数のタスクが実行された後、パラメータを渡してstart()関数を再呼び出したとき、2回目の呼び出しスレッドが正常に起動して実行されなかったという問題が発生しました.また,run()関数はコード単一ステップの進捗から実行済みである.この問題の主な原因は,同一スレッドオブジェクトのstart()が同一時間に複数回呼び出され,1回目のスレッド呼び出しスレッドがまだ終了していない場合,2~N回目がQTによって自動的にブロックされることである.スレッドの終了はrun()関数の実行完了を判断条件とすることができず,スレッドのisFinished()関数を判断条件とすることができる.
        QThread*      pThread = new QThread(this);
        pThread->start();//初回呼び出し、スレッド関数を正常に起動
        pThread->start();//1回目の呼び出しスレッドがまだ終了していない条件で、直接2回目の呼び出しを行うと、今回の呼び出しは無効になります
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]