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)

这是 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作用。我把它放在那里以防万一。也许这就是问题的一部分。

4

1 回答 1

0

我在您的代码中看到的一个错误是您必须在启动线程之前锁定互斥锁,否则它可能会在您开始等待它之前发出初始化信号。我不确定这是否解释了您的问题(实际上,它可能没有),但修复它仍然会很好。如果问题仍然存在,恐怕你真的需要调试它,看看发生了什么,即哪个线程在做什么。

遗憾的是我们不能只wxThread在这里使用,必须编写特定于平台的代码来初始化平台无关的库是非常烦人的。我们真的应该添加一些wxInitializeInNewThread()或类似的东西......如果你有兴趣贡献它,请不要犹豫,发布到 wx-dev 邮件列表。

于 2013-10-16T15:02:08.613 回答