共有ライブラリからロードされる wxWidgets アプリを作成したいと考えています。既存の C アプリケーションにプラグインとして追加する必要があります。
wxWidgets のサンプル ディレクトリ (/samples/dll) で、「my_dll.cpp」というファイルを見つけました。それはまさに私が必要とするものです。ただし、Windows専用です。.so Linux バージョンを作成する必要があります。
そのため、pthreads に関連するすべての winapi スレッドを書き直しました。私は実際にマルチスレッドを行ったことがないので、おそらくコードに多くの間違いがありますが、それらを見つけることができません。
多分誰かが助けることができます。
最も関連性の高い機能は次のとおりです。
void run_wx_gui_from_dll(const char *title)
と
void* MyAppLauncher(void* event)
これは、winapi スレッドを使用する wxWidgets のサンプル ファイルへのリンクですhttp://pastebin.com/KhK4uiKZ ここは、pthreads を使用するコードへのリンクですhttp://pastebin.com/QmsPqYs5
私の pthread バージョンは、最後にスリープ状態にした場合にのみ正しく動作しrun_wx_gui_from_dll
ます。
スリープCMD_SHOW_WINDOW
がなければ、新しいフレームは開きません。ただ何も起こりません。入れputs("received show window command");
ましたvoid MyDllApp::OnShowWindow
。文字列は stdout に出力されるので、wxQueueEvent が機能することがわかります。しかし、wxWidgets はブロックしているようですwxFrame *f = new MyDllFrame
...
...
// Send a message to wx thread to show a new frame:
wxThreadEvent *event =
new wxThreadEvent(wxEVT_THREAD, CMD_SHOW_WINDOW);
event->SetString(title);
wxQueueEvent(wxApp::GetInstance(), event);
sleep(3);
}
Windows版はスリープ不要です。
run_wx_gui_from_dll
wxWidgets イベントループが呼び出される新しいスレッドを開始します。次に、コマンドをキューに入れるまで、wxWidgets が適切に初期化されるまで待機する必要があります。そのため、pthread 条件を使用しました。Windows版でも同様のことができます。
私も何のことかわかりませんwxCriticalSectionLocker
。念のため置いておきました。多分それは問題の一部です。