0

共有ライブラリからロードされる 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_dllwxWidgets イベントループが呼び出される新しいスレッドを開始します。次に、コマンドをキューに入れるまで、wxWidgets が適切に初期化されるまで待機する必要があります。そのため、pthread 条件を使用しました。Windows版でも同様のことができます。

私も何のことかわかりませんwxCriticalSectionLocker。念のため置いておきました。多分それは問題の一部です。

4

1 に答える 1

0

あなたのコードに見られるエラーの 1 つは、スレッドを起動する前にミューテックスをロックする必要があるということです。これで問題が説明できるかどうかはわかりませんが (実際にはそうではない可能性があります)、修正することをお勧めします。問題が解決しない場合は、実際にデバッグして、何が起こっているか、つまり、どのスレッドが何をしているかを確認する必要があると思います。

wxThreadプラットフォームに依存しないライブラリを初期化するためにプラットフォーム固有のものを書かなければならないのはかなり面倒です。このようなものを追加するwxInitializeInNewThread()必要があります...偶然にも、貢献することに興味がある場合は、遠慮なく wx-dev メーリング リストに投稿してください。

于 2013-10-16T15:02:08.613 に答える