Qt を使用しない libcommuni を、Qt を使用しない別の DLL プロジェクトにラップしています。私が知る限り、QCoreApplication
ネットワーキングやシグナルなどが適切に機能することを確認するには、Qt メッセージ ポンプを (経由で) 実行する必要があります。ただし、それを行う方法を理解するためにいくつかの問題に直面しています。
QCoreApplication::exec()
基本的に、すべての Qt イベントを呼び出してポンプする DLL でスレッドをスピンアップしたいと考えています。次に、別のスレッドにある DLL への外部呼び出しを Qt メイン スレッドにマーシャリングして、libcommuni を安全に使用できるようにします。
これにはシグナルとスロットを使用することが推奨されるアプローチのようですが、私はそれを機能させることができませんでした。QObject
DLL 経由で呼び出されるクラスでシグナルを作成し、それをQThread
Qt メッセージ ポンプを実行する のスロットに接続します。ただし、Qt::QueuedConnection
シグナルとスロットを接続するときに指定すると、シグナルを送信してもメッセージが配信されません。完全に省略した場合Qt::QueuedConnection
、スロットは Qt のメイン スレッドではなく、呼び出し元のスレッドですぐに呼び出されます。
また、DLL スレッドで明示的に呼び出しQCoreApplication::postEvent()
てイベントを Qt メイン スレッドに送信しようevent(QEvent)
としましたが、 target で呼び出されることはありませんQThread
。
ここで私が間違っていることについてのアイデアはありますか? Qt のスレッド モデルをよく理解していないと思います。