2011-01-22 8 views
0

내 프로그램의 여러 스레드가 통신하는 데 도움이되는 메시지 큐 (Windows에서 제공)를 사용하고 있습니다. 그러나 프로그램에서 모든 스레드에 메시지를 한 번에 보내야합니다. 이 작업을 수행 할 수있는 기능이 있습니까?모든 스레드에 메시지를 보낼 수 있습니까?

+0

왜? 모두 같은 시간에 처리를 시작할 수는 없으므로 PostThreadMessage를 N 번 호출하면 어떤 문제가 발생합니까? – Tergiver

+0

가끔씩 가변 개수의 쓰레드를 가지기 때문에 어떤 쓰레드를 보낼지 알아내는 번거 로움이 있습니다. – Mark

+0

HWND_BROADCAST에 게시를 시도 했습니까? 쓰레드가 어떤 조건을 만족해야하는지 정확히 모르겠습니다. 각 스레드마다 최상위 창이 필요할 수도 있습니다. 확실하지 않습니다. HWND_BROADCAST를 사용하는 경우 RegisterWindowMessage를 사용해야합니다. – Tergiver

답변

1

일반 스레드 메시지 (창없이)는 Windows에서 신뢰할 수 없습니다. 트레이스없이 삼켜 버리고 상황을 처리 할 스레드가없는 상황이 있습니다. 따라서 윈도우 타겟 메시지는 항상 해당 윈도우의 윈도우 프로 시저에 의해 처리되기 때문에 메시지 타겟을위한 최상위 레벨 윈도우를 갖기를 원합니다. 해당 스레드에 대한 가시 창이 필요하지 않은 경우 메시지 전용 창 (부모가 HWND_MESSAGE)으로 만들 수 있습니다.

각 스레드에 대한 창을 얻었 으면 EnumWindows 또는 EnumChildWindows으로 창을 열거하고 원하는 메시지를 보낼 수 있습니다. 또는 스레드 메시지 창 목록을 유지하고 각각에 메시지를 보낼 수 있습니다. 프로세스의 모든 스레드에 메시지를 보내는 간단한 방법은 없습니다.

+0

메시지 펌프가 실행 중이 아니므로 시스템 모달 루프 중 누락되었습니다. 보이는 윈도우가없고 MessageBox 또는 DialogBox를 호출하지 않으면 시스템 모달 루프가 실행되지 않습니다. – Tergiver

+0

슬프게도 메시지 펌프를 포함하는 유일한 기능이 아닙니다. IIRC에서 COM 구성 요소를 사용하면 일부 상황에서 스레드 메시지가 삭제 될 수 있습니다. –

+0

아, 네 .. COM. 전염병처럼 피하십시오. COM은 아직 죽지 않았 니? ;) – Tergiver

관련 문제