mspoerr
mspoerr

Reputation: 2710

Crash with boost::thread

I am using wxwidgets together with boost::thread. The Thread is a worker thread which sends some Events to the GUI:

Thread creation:

thrd = boost::thread(boost::bind(workerFunction,this));

Send Message to the GUI:

wxPostEvent(loWindow, event);
wxSafeYield();

Under Windows I don't see any problems, but when starting the application under Linux (Ubuntu 8.10), it stops with the following error message:

_XCBUnlockDisplay: Assertion `xcb_get_request_sent(dpy->xcb->connection) == dpy->request' failed.
Aborted

What am I missing? When the workerFunction is not started in a thread, it works without problems.

Regards, /mspoerr

Upvotes: 1

Views: 1642

Answers (2)

mspoerr
mspoerr

Reputation: 2710

The problem was with the data I sent - for complex data you need to use custom events. I now implemented a custom event and it works.

For more information please see http://forums.wxwidgets.org/viewtopic.php?t=24663

Thank you for your help!

/mspoerr

EDIT: Updated the link. The old one was broken

Upvotes: 0

Johannes Schaub - litb
Johannes Schaub - litb

Reputation: 507055

Don't call wxYield from a worker thread. Only do that from the GUI thread. Yield will process gui events, and is intended to be used if in some GUI event handler you do much of work and want to update other controls and process pending events in between. The Safe in wxSafeYield means that it disables GUI controls before it processes pending events first. That will protect you from such cases like entering the event handler you called wxYield from a second time, recursively. It doesn't mean that it is thread-safe, or something like that.

If you want to give the rest of the time slice your thread would have to other threads, call wx's wxThread::Yield or boost's this_thread::yield (depending on your thread class) instead.

Upvotes: 4

Related Questions