QT共有ライブラリを非QT C++アプリケーションと統合する必要があります。 イベントを処理するために、ライブラリからQCoreApplicationを開始する関数を呼び出し、必要なオブジェクトを別々のQThreadまたはstd :: threadで呼び出します。どちらも動作します。 イベントループを開始した後、SQLデータベースからデータを取得するために作成されたオブジェクトメソッドをメインスレッドから呼び出す必要があります。何らかの理由でそれらが常に動作しているとは限りません。 ネイティブのQTアプリケーションでこれらのオブジェクトをスレッド化せずに使用すると、これは起こりません。 問題を関数にトレースすることはできますが、残念ながら、それは閉じた別のライブラリの一部です。 何が問題になる可能性がありますか?DLL内のQTイベントループ
1
A
答えて
1
ネイティブアプリケーションは、メインスレッドでネイティブイベントループを回転させる必要があります。 Qtはほとんどのプラットフォームでネイティブイベントループを使用しますので、QCoreApplication::exec()
を使用する必要はなく、イベントをディスパッチするためにブロックします。代わりに、まともなクロスプラットフォームのメインスレッドのイベントループの統合は、イベントループを1回回転させるだけで "プライム"にします。これにより、Qtは、与えられたスレッド(ここではメインスレッド)上でネイティブイベントループを実行する人がイベントを送出できるようになります。
メインスレッド以外のスレッドでQApplication
をインスタンス化するのは移植性がありません。 Windows上で動作しますが、OS Xではまったく動作しません。また、X11で動作するかどうかは、統合するプラットフォームの正確な実装によって異なります。その時点で
static std::unique_ptr<QApplication> app;
static int argc{1};
static const char * argv[] = { "myLibrary", nullptr };
void myLibraryInit() {
app.reset(new QApplication{argc, argv});
QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection);
app.exec();
}
void myLibraryDeInit() {
app.reset();
}
、あなたは自分自身のイベントループを回し任意のQThread
秒を開始し、必要だと、他のものは何でもして自由です。どのデータベースアクセスオブジェクトも、それらが使用されるスレッドに作成されていることを確認する必要があります。
関連する問題
- 1. 非QtアプリケーションのMacイベントループQtプラグイン
- 2. Qt Main-Guiと他のスレッド+イベントループ
- 3. Qtのイベントループとは何ですか?
- 4. Qtがイベントループをブロックしました
- 5. QTの遅延DLLロード
- 6. Qt - Dll関連の問題
- 7. DLL内のアイコンにQtリソースを使用する
- 8. イベントループ内のアクティブなタスクをカウントする
- 9. Qt:イベントループが始まると通知がありますか?
- 10. Qtコンソールアプリケーション:whileループはイベントループをブロックします
- 11. イベントループ
- 12. C++ dllとQT GUIの間の通信
- 13. Reliabily DLL内のDLLをアンロード
- 14. DLL(VSTプラグイン)のQt GUI環境
- 15. すべてのqt dllをアンロード
- 16. アニメーションのQStateMachineイベントループ
- 17. NodeJSイベントループのポーリングフェーズ
- 18. qtプロジェクトにpthreadgc2.dllを接続する
- 19. Qt C++でDLLを使用する
- 20. qt内のプレースホルダ
- 21. SDL:2つのイベントループ?
- 22. asyncioイベントループの監視
- 23. CometProcessor Endイベントループ
- 24. JavaScriptスタック、キュー、イベントループ?
- 25. イベントループ対マルチスレッドブロックIO
- 26. サードパーティアプリケーション内のQtプラグインアプリケーション
- 27. Qtオブジェクト内のスレッド
- 28. JavaScriptイベントループのコンテキスト内のヒープとは何ですか?
- 29. イベントループ内のキューに入れられたJavaScriptメッセージの削除
- 30. 独自のスレッド内でイベントループを実行する
私はWindows上でアプリケーションを使用する必要があり、プレーンなC++アプリケーションでなければなりません。 イベントループに「プライミング」を行い、必要なオブジェクトを実行するQThreadを開始しましたが、シグナル/スロットは機能しません。 –
申し訳ありませんが、イベントループがQThreadで動作していますが、問題はrunメソッドを再実装したことです。 –