0

フラグを設定してスレッドの停止を開始する (そしてスレッド内から戻る) には、スレッドと通信する必要があります。

スレッド化はこのように実装されています

MyClass* obj = new MyClass(0);
connect( this,SIGNAL( stop() ),obj, SLOT(stop()));
emit stop();    // slot is called (qDebug output)

MyThread = new QThread;
obj->moveToThread(MyThread);
connect( ... started() ... quit() ... finished() ... deleteLater() ...
....

emit stop();    // slot isn't called (qDebug output)

スロットにはまだロジックがなく、qDebug() 出力を使用するだけです。オブジェクトの作成と接続は、メイン ウィンドウ メソッドで行われます。

残念ながら、何が間違っているのかわかりません。オブジェクトがスレッドに移動されると、スロットは実行されなくなります。

4

2 に答える 2

1

コピー/貼り付けを忘れただけなのに、MyThread->start()電話に出られないかもしれません。また、スレッドを宣言する行はである必要がありますがQThread * MyThread = new QThread();、それはおそらくタイプミスでした。

さて、あなたの答えでは、あなたはを使用することでQt::DirectConnectionあなたの問題が解決したようだと言います。ただし、直接接続を使用して呼び出されたスロットは、slotメソッドを直接呼び出すだけです。slotメソッドは実行されていますが、呼び出し元のスレッド(stop()シグナルが発行される場所)から実行されています。これは、スレッドが開始されていない場合でも機能します。本当に必要なのは、スロットが。を介して呼び出されることQt::QueuedConnectionです。これにより、ワーカースレッドのイベントループにイベントが配置され、スロットが呼び出されます。指定しない場合、Qtが接続タイプを処理することに注意してください。

キューに入れられた接続が機能しない場合は、スレッドのイベントループを作業でブロックしている可能性があります。作業メソッドで、イベントを処理できるように制御をイベントループに戻すことはありますか?whileそれとも、フラグが状態を変更するのを待っているループで実行されるだけですか?

また、コードはそのままコンパイル/実行されません。私はあなたがすでにものを扱っていると思います-つまり、あなたの関数ですべてが設定された後QApplicationに呼び出します。を呼び出さない場合、メインイベントループは開始されません。QApplication::exec()mainexec()

于 2013-01-25T16:08:58.580 に答える
-1

デバッグ出力が実際に行われたのは、スレッドが作業を終了した後でした。使用する

connect( this, SIGNAL(stop()), obj, SLOT(stop()), Qt::DirectConnection);

問題を解決しました。

于 2013-01-25T15:51:12.817 に答える