から派生したクラスがありQThread
ます: class MyClass : public QThread
このクラスは別のオブジェクトのスロットに接続されています。もともとこれは として接続されていましQt::AutoConnection
た。しかし、スレッドが開始されるとすぐに ( MyClass::run()
)、シグナルが「スロットに到達」しなくなります (なぜですか? )。
// connected before myObject->run()
s = QObject::connect(
_myObject, SIGNAL(signalLogMessage(const QString&, QtMsgType)),
this, SLOT(slotLogMessage(const QString&, QtMsgType)), Qt::DirectConnection);
私の最初のアイデアは、強制する必要があるということでしたQt::QueuedConnection
(this
/_myObject
はクロススレッドになります)。この場合、まったく機能しません。のみQt::DirectConnection
動作します。スレッドが開始された後は、IMHOQt::QueuedConnection
が正しい選択です (クロス スレッド)。
何がうまくいかないのですか?接続自体は正しいようQt::DirectConnection
です。
編集1: - ハイドの答え/ニコスのコメントの時点で
現時点では、ハイドの答え/ニコスのコメントが根本的な原因を指摘していると思います。私QThread
は別のアプリケーションに対して独自のメッセージループを実行しています。これが独自のスレッドで実行され、基本的に無限ループである理由です。
run() {
// exec(); // while not reached
while (_runMessageLoop && ...) {
hr = CallDispatch(.....);
if (hr== 0) QThread::msleep(100);
// QCoreApplication::processEvents();
}
}
この無限ループが原因で、Qt メッセージ ループが実行されておらず、シグナル/スロットが処理されていないと推測します (これは正しいですか?) Qt::DirectConnection
Qt メッセージ ループを必要とせずに直接メソッドを強制的に呼び出す場合、これが唯一の接続タイプの作業。
問題は、Qt と自分のメッセージ ループをどのように組み合わせることができるかということです(これが実現可能な場合)。ループの前に exec() を呼び出すことはできません (Qt ループ内にあるため) QCoreApplication::processEvents();
。
=> ここで新しい質問を参照してください:独自のメッセージ ループと Qt イベント ループを組み合わせる方法は?