Windows 7 Ultimate (32 ビット)マシンでQt 4.7.0 (32 ビット)を使用しています。私はおそらくバージョン 4.0 または 4.2 から Qt を使用しており、ほぼすべての4.xyリリースを使用しています。
最近、Qt 4.7 で問題が発生しました。
Qt の古いバージョンでマルチスレッド アプリケーションを作成しました。バージョンを忘れてしまいましたが、適切にコンパイルして実行した最後のバージョンは、おそらく 4.5.x または 4.6.x です。4.7 ではネジ部分が正しく動作していないようです。または、何かを誤解していました。問題は次のとおりです。
メインスレッドはスレッドを開始thinker
します。スレッドのrun()
機能は次のとおりです。thinker
void ThinkerThread::run()
{
_threads_running = NSUBTHINKERS;
// ...
_sub_thinker[0].start();
// ...
_sub_thinker[1].start();
exec();
}
の信号は、すべての のスロットに接続されて_sub_thinker
います。すべての s が終了すると、が呼び出されます。finished()
ThinkerThread::subThinkerFinished()
_sub_thinker
_sub_thinker
ThinkerThread::subThinkerFinished()
quit()
quit()
と呼ばれる別の場所があります。
void ThinkerThread::tryKill()
{
for (int i = 0; i < NSUBTHINKERS; i++)
_sub_thinker[i].tryKill();
quit();
}
メインスレッドから、実行は次のようになります。
- thinker.tryKill() [注: 最初の実行では、thinker は実行されていませんでした。]
- thinker.start()
thinker
のfinished()
信号は に接続されていautoMove()
ます。
以前のすべてのバージョンの Qt では、autoMove()
が呼び出された後thinker::quit()
に呼び出されましThinkerThread::subThinkerFinished()
た。4.7 では、スレッドが実行されていなくても、 のautoMove()
最初の呼び出しの後に呼び出されることがわかりました。thinker.tryKill()
何か案が?
もちろん、実行中ThinkerThread::tryKill()
かどうかthinker
は内部で確認できます。しかし、なぜこれが起こっているのか知りたいです。
ありがとう。