1

この質問のような永久ループはありませんが、それでも finished() シグナルを発行しません。

クラスのコンストラクターで:

connect (&thread, SIGNAL(started()), SLOT(threadFunc()));
connect (&thread, SIGNAL(finished()), SLOT(finished()));

finished() 関数では、

void XX::finished()
{
  qDebug() << "Completed";
}

void XX::threadFunc()
{
  qDebug() << "Thread finished"; // only single line, finishes immediately
}

しかしfinished()、スレッドを で開始する前に毎回 get が呼び出されることはありません。手動でthread.start()呼び出す必要がありますthread.terminate()。QThread の使用法を誤解していましたか?

4

1 に答える 1

2

QThreadメソッドが終了するとfinishedシグナルを発します。QThread::runおそらく、これの実装が正しくありません。

メソッドのデフォルトの実装はrun次のようになります。exec別のメソッドを呼び出すだけです。

void QThread::run()
{
    (void) exec();
}

メソッドの実装はexecもう少し複雑です。今、私はそれを単純化しました。

int QThread::exec()
{
    // .....

    if (d->exited) {
        return d->returnCode;   
    }

    // ......

    QEventLoop eventLoop;
    int returnCode = eventLoop.exec();
    return returnCode;
}

コードから判断すると、2 つのケースで終了する可能性があります。最初のケースでは、すでに終了している場合。exit()次に、イベント ループに入り、が呼び出されるまで待機します。

無限スレッド ループがここにあることがわかります。QThread::quit()したがって、 which is equalが必要ですQThread::exit(0)

PS使用しないでくださいterminate。危険です。

于 2012-10-18T04:55:12.850 に答える