2009-06-28 4 views
1

Я использую wxwidgets вместе с boost :: thread. Нить рабочий поток, который посылает несколько событий в графическом интерфейсе:Crash with 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

ответ

0

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

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

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

/mspoerr

EDIT: Обновил ссылку. Старый был сломан

+0

Да, с тем кодом, который вы опубликовали, причина аварии очевидна :) –

+0

Спасибо за ваши волнующие слова;) – mspoerr

+0

ваша ссылка не работает. :( – ryanrhee

4

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

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

+0

Благодарим вас за ответ, но документ wxWidgets гласит: «Удерживает управление ожидающими сообщениями в системе окон. Это может быть полезно, например, когда трудоемкий процесс записывает текст Окно. Без случайного выхода текстовое окно не будет обновляться должным образом, а в системах с совместной многозадачностью, таких как другие процессы Windows 3.1, не будет реагировать ». И, на мой взгляд, это то, что мне нужно. Когда я не использую эту функцию, также происходит сбой приложения Windows. /mspoerr – mspoerr

+0

В документации, которую вы цитируете, речь идет о однопоточных приложениях. Если вы хотите, чтобы вы играли в фоновом потоке, используйте функцию операционной системы, такую ​​как Sleep (0) (определенная в windows.h) или уравновешивающий уровень. –

+0

и какой рекомендуемый способ реализовать это? – mspoerr

 Смежные вопросы

  • Нет связанных вопросов^_^