0

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_thinkerThinkerThread::subThinkerFinished()quit()

quit()と呼ばれる別の場所があります。

void ThinkerThread::tryKill()
{
    for (int i = 0; i < NSUBTHINKERS; i++)
        _sub_thinker[i].tryKill();
    quit();
}

メインスレッドから、実行は次のようになります。

  • thinker.tryKill() [注: 最初の実行では、thinker は実行されていませんでした。]
  • thinker.start()

thinkerfinished()信号は に接続されていautoMove()ます。

以前のすべてのバージョンの Qt では、autoMove()が呼び出された後thinker::quit()に呼び出されましThinkerThread::subThinkerFinished()た。4.7 では、スレッドが実行されていなくても、 のautoMove()最初の呼び出しの後に呼び出されることがわかりました。thinker.tryKill()

何か案が?

もちろん、実行中ThinkerThread::tryKill()かどうかthinkerは内部で確認できます。しかし、なぜこれが起こっているのか知りたいです。

ありがとう。

4

1 に答える 1

0

の状態(つまり、実行中/非実行中)に関係なく、 が呼び出さQThread::finished()れるたびに が発行されることがわかりました。以前のバージョンの Qt には当てはまりませんでした。QThread::quit()QThread

于 2010-12-24T17:00:39.367 に答える