我将 wxwidgets 与 boost::thread 一起使用。 Thread 是一个工作线程,它向 GUI 发送一些事件:
线程创建:
thrd = boost::thread(boost::bind(workerFunction,this));
向 GUI 发送消息:
wxPostEvent(loWindow, event);
wxSafeYield();
在 Windows 下我没有看到任何问题,但是在 Linux (Ubuntu 8.10) 下启动应用程序时,它停止并显示以下错误消息:
_XCBUnlockDisplay: Assertion `xcb_get_request_sent(dpy->xcb->connection) == dpy->request' failed.
Aborted
我错过了什么?当 workerFunction 没有在线程中启动时,它可以正常工作。
问候, /mspoerr
最佳答案
不要从工作线程调用wxYield
。只能从 GUI 线程执行此操作。 Yield 将处理 gui 事件,如果您在某些 GUI 事件处理程序中做了很多工作并且想要更新其他控件并处理其间的未决事件,则可以使用它。 wxSafeYield
中的Safe
意味着它在首先处理未决事件之前禁用 GUI 控件。这将保护您免受此类情况的影响,例如从第二次递归地进入您调用的事件处理程序 wxYield
。这并不意味着它是线程安全的或类似的东西。
如果您想将您的线程的剩余时间片分配给其他线程,请调用 wx 的 wxThread::Yield
或提升的 this_thread::yield
(取决于您的线程类)。
关于c++ - 使用 boost::thread 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055643/