2009-06-28 119 views
1

我正在使用wxwidgets与boost :: 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

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

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

谢谢您的帮助!

/mspoerr

编辑:更新的链接。旧的已损坏

4

不要从一个工人线程wxYield。只能从GUI线程完成。 Yield将处理gui事件,并且如果在某些GUI事件处理程序中执行了大量工作并希望更新其他控件并处理其间的未决事件,则会使用该功能。 wxSafeYield中的Safe表示它在第一次处理未决事件之前禁用GUI控件。这样可以保护您不受这种情况的影响,例如递归地从第二次进入事件处理程序wxYield。这并不意味着它是线程安全的,或类似的东西。

如果您想给出剩余的时间片,您的线程将不得不通过其他线程,请调用wx的wxThread::Yield或boost的this_thread::yield(取决于您的线程类)。

+0

感谢您的回答,但wxWidgets文档中提到: “在窗口系统中产生对待处理消息的控制,例如,当一个耗时的过程写入文本时没有偶然的良率,文本窗口将不会被正确更新,并且在具有协作式多任务处理的系统上,比如Windows 3.1其他进程不会响应。“ 在我看来,这是我需要的。当我不使用这个功能时,Windows应用程序也崩溃了。 /mspoerr – mspoerr 2009-06-28 20:58:39

+0

您引用的文档正在讨论单线程应用程序。如果您想要在后台线程中运行,请使用像Sleep(0)(在windows.h中定义)或升级平衡的操作系统函数。 – 2009-06-28 21:18:27