【问题标题】:How to make a wxWidget method that could be used as a callback in C library?如何制作一个可以在 C 库中用作回调的 wxWidget 方法?
【发布时间】:2014-09-15 01:09:52
【问题描述】:
我有一个共享的 C 库,它在单独的线程中从 COM 端口读取数据。
还有一个 C++ wxWidget 应用程序,它等待来自 lib 的数据并将其呈现在 UI 中。
我需要创建一个回调函数,当收集正确的数据包时,lib 将调用该函数。
我在 wxWidget 框架类中创建了一个静态变量,其中包含一个指向该类对象的指针和一个静态方法,我将指针作为回调提供给库。那是回调工作,但在这个原因我不能修改用户界面。程序因 SIGABRT 信号而崩溃。如我所见,从非主线程修改 wxWidgets UI 是一种不好的方法。但我不知道该怎么做。你能帮助我吗?谢谢。
【问题讨论】:
标签:
c++
c
callback
pthreads
wxwidgets
【解决方案1】:
是的,您只能从单个(通常称为“主”,但它不必是应用程序的实际主线程,只是初始化 wxWidgets 的那个)线程中使用 wxWidgets GUI 函数。您可以从另一个线程安全地做的唯一事情是向 GUI 线程发布一个事件,要求它代表该线程执行某些操作,请参阅wxQueueEvent()。
从 wxWidgets 3.0 开始有一个方便的包装器,使用相同的底层机制,称为CallAfter()。特别是如果你使用 C++11,它使用起来非常简单,你可以直接将要在主线程中执行的代码传递给它,例如
void MyThreadCallback(void* data)
{
wxTheApp->CallAfter([=]() {
wxMessageBox("This is safe because we're in the main thread now");
// Do whatever you need to do with "data"
});
}