2013-06-18 9 views
2

CreateEvent로 전역 이벤트를 만들었으며 OpenEvent를 사용하는 다른 응용 프로그램에서이 이벤트를 처리합니다.핸들/이벤트 비동기 대기 또는 동일한 스레드 내에서 콜백

(pesudo 코드) my_call_back이 register_event_change_notification라는 동일한 스레드에서 실행됩니다

register_event_change_notification(my_call_back); 

void my_call_back() 
{ 
    // do work 
} 

:

그런 다음 내가 좋아하는 일을하고 싶습니다. 그러나 내 문제는 내가 이것을 허용하는 API를 찾을 수 없다는 것입니다. 당신은 다음과 같은 옵션이 나타납니다 :

  1. 은의 WaitForSingleObject를 사용하는 스레드를 만든 다음 바로 my_call_back 호출하고 모든 주위에 중요한 부분을 넣어.

  2. WaitForSingleObject를 사용하는 스레드를 만들고 메시지 루프로 주 스레드를 차단 한 다음 WaitForSingleObject가 메시지 루프와 동일한 스레드에서 실행되는 my_call_back을 가져올 때 이벤트를 게시하십시오. 이는 register_event_change_notification을 호출 한 스레드와 다를 수 있습니다.

이것은 여러 번 해결되었을 것입니다. 이벤트가 IMO에 신호를 받았을 때 알 수있는 스레딩 문제를 처리해야하는 과도한 부담입니다.

편집 :

내가 QueueUserApc를 사용하여 들어갑니다 결국

-하지만 당신의 메시지를 넣어은 * 예 API의이 스레드를 Alertable State에 넣기 위해서 사용해야 함을 의미한다. 또 하나의 장애물은 APC의 모든 서비스를 받기 전에 미해결 된 APC를 추적하고 객체를 파괴하지 말아야한다는 것입니다. 그렇지 않으면 파괴/삭제 된 개체에 대기중인 APC가 표시됩니다.

답변

0

귀하의 분석을 통해 메시지를 전송하는 것은 올바른 것입니다. 메시지를 사용하는 옵션 2의 경우 두 가지 옵션을 사용하여 원하는 스레드로 알림을 전달할 수 있습니다. (a) 비 GUI 스레드 목적지의 경우 PostThreadMessage를 사용하십시오. (b) GUI 스레드 대상의 경우 PostMessage 또는 SendMessage를 대상 HWND에 보낼 수 있습니다. 메시지는 HWND를 생성 한 스레드에 의해 수신됩니다.

0

여기에 - http://pastebin.com/ucpDdYGZ -이 내 결정입니다. 죄송합니다 영어 이외의 의견 (그들은 러시아어 있습니다).

주요 아이디어는

m_wnd = CreateWindowA("STATIC", "", 0, 
     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
     HWND_MESSAGE, NULL, NULL, NULL); 

와 더미 창을 만들고 옵션의 SendMessage