【问题标题】:Crash with boost::threadboost::thread 崩溃
【发布时间】:2010-11-06 12:56:27
【问题描述】:

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

【问题讨论】:

    标签: c++ linux crash wxwidgets boost-thread


    【解决方案1】:

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

    更多信息请查看http://forums.wxwidgets.org/viewtopic.php?t=24663

    感谢您的帮助!

    /mspoerr

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答,但是 wxWidgets 文档说:“让控制窗口系统中的未决消息。例如,当一个耗时的进程写入文本窗口时,这可能很有用. 如果没有偶然的收益,文本窗口将无法正确更新,并且在具有协作多任务的系统上,例如 Windows 3.1,其他进程将不会响应。在我看来,这就是我所需要的。当我不使用此功能时,Windows 应用程序也会崩溃.. /mspoerr
    • 您引用的文档是关于单线程应用程序的。如果您想在后台线程中运行,请使用诸如 Sleep(0)(在 windows.h 中定义)或 boost equilivent 之类的操作系统函数。
    • 推荐的实现方式是什么?
    • @mspoerr,xcb 错误消息似乎表明 GUI 出现问题。请注意,您不允许从工作线程访问 GUI 的 anything (例如在窗口中绘画,...)。通过向 GUI 发送事件并在那里做 GUI 的事情来做所有事情。
    • 那我帮不了你了。访问 freenode irc 上的 #wxwidets 和 #xcb 或类似内容,也许他们可以帮助您。祝你好运,也许这里的另一个人有答案。通常,众所周知,XCB 可以很好地与线程一起工作,也许你或 rwx 错过了调用一些 xcb 函数(我记得这个问题存在于一些 KDE 程序和 xine 中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多