使用 wxWidgets(使用 pthreads)创建共享 ilbrary 应用程序
Creating a shared ilbrary app with wxWidgets (with pthreads)
我想创建一个从共享库加载的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 邮件列表。
- 使用共享指针的函数调用,其对象应为 const
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- CUDA 使用共享内存平铺 3D 卷积实现
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- 使用共享 lLibrary 是否需要来自不同lua_State?
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- 使用Bazel C++教程;build不创建/使用共享库
- 使用共享库编译可执行文件时仅链接所需的符号
- 使用共享库进行变体处理是个好主意吗?
- 在向量中使用共享指针来访问类对象
- 在任何地方使用共享指针有哪些陷阱?
- 使用共享库版本支持不同 ABI 的最佳实践是什么?
- 如何使用C++共享目录,以便每个人都可以访问
- 在 pthread 中使用共享变量
- 使用共享指针加载到变量 C++ 中
- 使用共享变量进行线程处理
- 如何使用共享内存在CUDA中转置巨大的任意矩阵
- 使用共享指针进行函数重载
- 何时使用共享指针向量,何时使用纯对象向量?