2009-06-28 2 views
1

나는 boost :: thread와 함께 wxwidgets를 사용하고 있습니다. 스레드는 GUI에 몇 가지 이벤트를 전송하는 작업자 스레드 :boost :: thread로 크래시

스레드 생성 :

wxPostEvent(loWindow, event); 
wxSafeYield(); 

윈도우에서 내가 어떤 문제를 볼 수 없습니다 다음 GUI에

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

메시지 보내기 리눅스 (우분투 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

편집 : 링크를 업데이트했습니다. 예전의 하나가 깨졌습니다.

+0

예, 게시 한 코드와 함께 충돌의 이유가 분명합니다. –

+0

당신의 호기심 많은 단어 주셔서 감사합니다;) – mspoerr

+0

링크가 끊어졌습니다. :( – ryanrhee

4

는 작업자 스레드에서 wxYield를 호출하지 마십시오. GUI 스레드에서만 그렇게하십시오. Yield는 gui 이벤트를 처리하며 일부 GUI 이벤트 핸들러에서 많은 작업을 수행하고 다른 컨트롤을 업데이트하고 그 사이에 보류중인 이벤트를 처리하려는 경우에 사용하기위한 것입니다. SafewxSafeYield 인 경우 보류중인 이벤트를 먼저 처리하기 전에 GUI 컨트롤을 사용할 수 없음을 의미합니다. 그러면 다시 호출 된 wxYield이라는 이벤트 핸들러를 입력하는 것과 같은 경우를 막을 수 있습니다. 스레드로부터 안전하다는 의미는 아닙니다.

나머지 스레드에 다른 스레드가 있어야 할 나머지 부분을 제공하려면 wx의 wxThread::Yield 또는 부스트의 this_thread::yield (스레드 클래스에 따라 다름)을 호출하십시오.

+0

답장을 보내 주셔서 감사합니다. 그러나 wxWidgets 문서에는 다음과 같이 쓰여 있습니다 : "윈도우 시스템에서 보류중인 메시지를 제어합니다. 예를 들어, 시간이 많이 걸리는 프로세스가 텍스트에 쓸 때 유용 할 수 있습니다 가끔 수확량이 없으면 텍스트 창은 제대로 업데이트되지 않으며 Windows 3.1과 같은 협업 멀티 태스킹 시스템에서는 다른 프로세스가 응답하지 않습니다. " 제 의견으로는 이것이 제가 필요한 것입니다. 이 함수를 사용하지 않으면 Windows 응용 프로그램도 충돌합니다. /mspoerr – mspoerr

+0

인용 한 설명서는 단일 스레드 응용 프로그램에 대해 설명합니다. 백그라운드 스레드에서 수행하려면 Sleep (0) (windows.h에 정의 됨) 또는 부스트 평형과 같은 운영 체제 기능을 사용하십시오. –

+0

및 이것을 구현하는 데 권장되는 방법은 무엇입니까? – mspoerr