使用 wxWidgets(使用 pthreads)创建共享 ilbrary 应用程序

Creating a shared ilbrary app with wxWidgets (with pthreads)

本文关键字:使用 共享 ilbrary 应用程序 创建 wxWidgets pthreads      更新时间:2023-10-16

我想创建一个从共享库加载的wxWidgets应用程序。它应该作为插件添加到现有的 C 应用程序中。

在wxWidgets的样本目录(/samples/dll)中,我找到了文件"my_dll.cpp"。这正是我所需要的。不过,它仅适用于窗户。我需要制作一个 .so linux 版本。

所以我重写了与 pthreads 相关的所有 winapi 线程。我从来没有真正做过多线程,所以代码中可能有很多错误,但我找不到它们。

也许有人可以帮忙。

最相关的功能是:

void run_wx_gui_from_dll(const char *title)

void* MyAppLauncher(void* event)

这是指向来自 wxWidgets 的示例文件的链接,该文件使用 Winapi 线程 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.字符串被打印到标准输出,所以我知道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是做什么的。我把它留在那里以防万一。也许这是问题的一部分。

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

同样

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