2017-02-17 16 views
1

QT共有ライブラリを非QT C++アプリケーションと統合する必要があります。 イベントを処理するために、ライブラリからQCoreApplicationを開始する関数を呼び出し、必要なオブジェクトを別々のQThreadまたはstd :: threadで呼び出します。どちらも動作します。 イベントループを開始した後、SQLデータベースからデータを取得するために作成されたオブジェクトメソッドをメインスレッドから呼び出す必要があります。何らかの理由でそれらが常に動作しているとは限りません。 ネイティブのQTアプリケーションでこれらのオブジェクトをスレッド化せずに使用すると、これは起こりません。 問題を関数にトレースすることはできますが、残念ながら、それは閉じた別のライブラリの一部です。 何が問題になる可能性がありますか?DLL内のQTイベントループ

答えて

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秒を開始し、必要だと、他のものは何でもして自由です。どのデータベースアクセスオブジェクトも、それらが使用されるスレッドに作成されていることを確認する必要があります。

+0

私はWindows上でアプリケーションを使用する必要があり、プレーンなC++アプリケーションでなければなりません。 イベントループに「プライミング」を行い、必要なオブジェクトを実行するQThreadを開始しましたが、シグナル/スロットは機能しません。 –

+0

申し訳ありませんが、イベントループがQThreadで動作していますが、問題はrunメソッドを再実装したことです。 –

関連する問題