我有一个共享的C库,它在一个单独的线程中从COM端口读取数据。 还有一个C ++ wxWidget应用程序,它等待来自lib的数据并在UI中呈现它。 当收集正确的数据包时,我需要创建一个回调函数,lib将调用。 我在wxWidget框架类中创建了一个静态var,它包含一个指向该类对象的指针和一个静态方法,指向我作为回调的库。这是回调工作,但在这个原因我无法修改UI。程序与SIGABRT信号崩溃。正如我所看到的,从非主线程修改wxWidgets UI是一种糟糕的方法。但我不知道如何做到另一个。你能帮助我吗?谢谢。
答案 0 :(得分:1)
是的,你只能使用单个的wxWidgets GUI函数(通常称为“main”,但它不必是应用程序的实际主线程,只是初始化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"
});
}