2009-06-28 94 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