1

我将 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

4

2 回答 2

4

不要wxYield从工作线程调用。只能从 GUI 线程执行此操作。Yield 将处理 gui 事件,如果在某些 GUI 事件处理程序中您做了很多工作,并且想要更新其他控件并处理介于两者之间的未决事件,则可以使用 Yield。SafeinwxSafeYield表示它在首先处理未决事件之前禁用 GUI 控件。这将保护您免受此类情况的影响,例如wxYield递归地进入您第二次调用的事件处理程序。这并不意味着它是线程安全的,或者类似的东西。

如果您想将线程的剩余时间片分配给其他线程,请改为调用 wx'swxThread::Yield或 boost's this_thread::yield(取决于您的线程类)。

于 2009-06-28T20:21:10.823 回答
0

问题出在我发送的数据上——对于需要使用自定义事件的复杂数据。我现在实现了一个自定义事件并且它可以工作。

欲了解更多信息,请参阅http://forums.wxwidgets.org/viewtopic.php?t=24663

感谢您的帮助!

/mspoerr

编辑:更新了链接。旧的坏了

于 2009-07-03T21:03:43.580 回答