C++ 如何制作一个wxWidget方法,在C库中用作回调?

C++ 如何制作一个wxWidget方法,在C库中用作回调?,c++,c,callback,pthreads,wxwidgets,C++,C,Callback,Pthreads,Wxwidgets,我有一个共享的C库,它在一个单独的线程中从COM端口读取数据。 和一个C++ WxWIDGET应用程序,它等待来自LIB的数据并在UI中渲染它。 我需要创建一个回调函数,当收集正确的数据包时,lib将调用该函数。 我在wxWidget框架类中创建了一个静态变量,其中包含一个指向该类对象的指针和一个静态方法,我将该指针作为回调提供给库。这是回调工作,但由于这个原因,我无法修改UI。程序因SIGABRT信号而崩溃。如我所见,从非主线程修改wxWidgets UI是一种不好的方法。但是我不知道如何再做

我有一个共享的C库,它在一个单独的线程中从COM端口读取数据。 和一个C++ WxWIDGET应用程序,它等待来自LIB的数据并在UI中渲染它。 我需要创建一个回调函数,当收集正确的数据包时,lib将调用该函数。
我在wxWidget框架类中创建了一个静态变量,其中包含一个指向该类对象的指针和一个静态方法,我将该指针作为回调提供给库。这是回调工作,但由于这个原因,我无法修改UI。程序因SIGABRT信号而崩溃。如我所见,从非主线程修改wxWidgets UI是一种不好的方法。但是我不知道如何再做一次。你能帮助我吗?谢谢。

是的,您只能从单个(通常称为“主”线程)线程使用wxWidgets GUI函数,但它不必是应用程序的实际主线程,而只是wxWidgets的初始化线程。从另一个线程可以安全地执行的唯一操作是向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"
    });
}