我想创建一个从共享库加载的 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)
这是 wxWidgets 中使用 winapi 线程的示例文件的链接http://pastebin.com/KhK4uiKZ 这里是使用 pthread 的代码的链接http://pastebin.com/QmsPqYs5
我的 pthread 版本只有在我在run_wx_gui_from_dll
.
没有睡眠CMD_SHOW_WINDOW
就不会打开一个新的框架。只是什么都没有发生。我放进puts("received show window command");
去了void MyDllApp::OnShowWindow
。该字符串被打印到标准输出,所以我知道 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
作用。我把它放在那里以防万一。也许这就是问题的一部分。