我正在使用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
答案 0 :(得分:4)
不要从工作线程调用wxYield
。只能从GUI线程中执行此操作。 Yield将处理gui事件,并且如果在某些GUI事件处理程序中执行大量工作并希望更新其他控件并处理其间的挂起事件,则可以使用它。 Safe
中的wxSafeYield
表示它在首先处理挂起事件之前禁用GUI控件。这将保护您免受诸如第二次以递归方式输入您调用wxYield
的事件处理程序之类的情况。这并不意味着它是线程安全的,或类似的东西。
如果你想给其余的时间片你的线程必须有其他线程,请调用wx的wxThread::Yield
或boost this_thread::yield
(取决于你的线程类)。
答案 1 :(得分:0)
问题在于我发送的数据 - 对于复杂数据,您需要使用自定义事件。我现在实现了一个自定义事件,它可以工作。
有关详细信息,请参阅http://forums.wxwidgets.org/viewtopic.php?t=24663
感谢您的帮助!
/ mspoerr
编辑:更新了链接。旧的那个坏了