Сбой с надписью :: поток - PullRequest
1 голос
/ 29 июня 2009

Я использую wxwidgets вместе с boost :: thread. Поток - это рабочий поток, который отправляет некоторые события в графический интерфейс:

Создание темы:

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

Отправить сообщение в графический интерфейс:

wxPostEvent(loWindow, event);
wxSafeYield();

В Windows я не вижу проблем, но при запуске приложения в Linux (Ubuntu 8.10) оно останавливается со следующим сообщением об ошибке:

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

Что мне не хватает? Когда рабочая функция не запущена в потоке, она работает без проблем.

С уважением, / Mspoerr

Ответы [ 2 ]

4 голосов
/ 29 июня 2009

Не вызывайте wxYield из рабочего потока. Делайте это только из потока GUI. Yield будет обрабатывать события графического интерфейса и предназначен для использования, если в каком-либо обработчике событий GUI вы выполняете большую часть работы и хотите обновить другие элементы управления и обработать ожидающие события между ними. Safe в wxSafeYield означает, что он отключает элементы управления графическим интерфейсом, прежде чем обрабатывает ожидающие события в первую очередь. Это защитит вас от таких случаев, как рекурсивный ввод обработчика событий, который вы вызывали wxYield во второй раз. Это не значит, что он потокобезопасен или что-то в этом роде.

Если вы хотите передать оставшуюся часть времени вашему потоку другим потокам, вызовите wx's wxThread::Yield или boost this_thread::yield (в зависимости от класса вашего потока ) вместо

0 голосов
/ 04 июля 2009

Проблема была в отправленных мною данных - для сложных данных вам нужно использовать пользовательские события Теперь я реализовал пользовательское событие, и оно работает.

Для получения дополнительной информации см. http://forums.wxwidgets.org/viewtopic.php?t=24663

Спасибо за вашу помощь!

/ mspoerr

РЕДАКТИРОВАТЬ: Обновлена ​​ссылка. Старый был сломан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...