1

から派生したクラスがありQThread: class MyClass : public QThreadます。runメソッドには、「自分の」メッセージループがあります。

run() { 
  // exec(); // while not reached    
  while (_runMessageLoop && ...) {
    hr = CallDispatch(.....);
    if (hr== 0) QThread::msleep(100); 
    // QCoreApplication::processEvents(); // Does not work
  }
}

exec()は実行されないため、 Qtイベントループはありません。これにより、信号/スロットが正しく機能しなくなります。Qtと私自身のメッセージループを組み合わせる機会はありますか?または、無限ループで達成したことを実行するために、頻繁に起動するタイマーが必要ですか?

4

2 に答える 2

1

これは実際にはイベント ループを正しく実装するための答えではありません。方法があると確信していますが、より多くの回避策があります。

スレッドを正常に開始し、exec() とすべてを開始し、開始シグナルをスロットに接続し (適切なスレッドで呼び出されることを確認してください)、そこにループを配置し、そのループで Qt の processEvents() を呼び出します。これにより、Qt イベント ループが適切に設定されます。

于 2012-10-24T22:43:23.623 に答える
1

「Qt-wise」の正しい方法は、タイマーを使用し、Qt にイベント ループを管理させることです。

外部のものに依存する必要がある場合はQAbstractSocket、外部ソケットを介してデータが入ったときにイベントを送信するなどのことを使用できます。

于 2012-10-24T17:05:25.773 に答える