메시지 대기 루프가있는 스레드가 내 Delphi 응용 프로그램에 있습니다. 메시지를받을 때마다 작업을 시작합니다. 이 스레드의 실행 절차는 다음과 같습니다.스레드가 메시지를 수신하지 않습니다.
procedure TMyThread.Execute;
begin
while GetMessage(Msg, 0, 0, 0) and not Terminated do
begin
{thread message}
if Msg.hwnd = 0 then
begin
...
end
else
DispatchMessage(Msg);
end;
end;
응용 프로그램을 사용하여 일부 테스트 수행 GetMessage 함수가 주 스레드에 의존한다는 사실을 발견했습니다. 이것은 메인 스레드가 일부 작업을 수행하는 동안 메시지가 수신 대기 중일 때 (메시지가 PostThreadMessage 함수를 사용하는 또 다른 스레드에 의해 전송 된 경우에도 내 스레드의 GetMessage 함수가 반환되지 않음을 의미합니다. PostMessage MyThreadId, WM_MyMessage, 0, 0)).
주 스레드가 작업을 끝내거나 Application.ProcessMessages 메서드가 호출 될 때만 GetMessage가 반환되고 스레드가 작업을 시작합니다. 이런 종류의 스레드 간 통신을 구현하면 내 스레드가 독립적으로 작동하고 스레드에 직접 전송되는 메시지의 수신이 주 스레드에 종속된다는 것을 결코 기대하지 않을 것입니다.
테스트 수행 주 스레드에서 WaitForSingleObject 함수를 사용하여 몇 초 동안 이벤트를 기다렸습니다. 이것은 메시지가 다른 스레드에 의해 보내 졌음에도 불구하고 내 스레드가 어떤 작업도 수행하지 않고 있다는 것을 알았을 때입니다. WaitForSingleObject 함수가 마침내 대기를 끝내고 주 스레드가 유휴 상태가되면 스레드의 GetMessage 함수가 반환됩니다.
누군가가 왜 이런 방식으로 작동하는지 설명 할 수 있습니까? 거기에 해결 방법이 있습니까? 내 스레드가 독립적으로 메시지를 수신하도록하고 싶습니다. 모든 스레드는 메인 스레드에 의해 생성됩니다. 이것이 그 이유일까요?
미리 도움을 주셔서 감사합니다.
마리우스.
Mghie, 당신은 절대적으로 다시 오른쪽 (당신은, 당신이 기억 수도 최근 메시징 물건으로 나를 도움이)되었다. 당신이 제안한 것처럼, GetMessage 함수는 즉시 반환하지만 스레드 중단은, 사실, 메인 윈도우 메소드의 호출에 : 개체 : (추기경 EventMask)
procedure TMyThread.Execute;
begin
while GetMessage(Msg, 0, 0, 0) and not Terminated do
begin
{thread message}
if Msg.hwnd = 0 then
begin
...
if Assigned(FOnCommEventMethod) then
FOnCommEventMethod(FCommEventsQueueItem);
...
end
else
DispatchMessage(Msg);
end;
end;
FOnCommEventMethod 프로 '로 선언 된 객체의 방법입니다 ; ' (이 스레드는 직렬 포트 이벤트를 처리합니다). 이 경우 FOnCommEventMethod에 주 양식 클래스에 속한 프로 시저가 지정되었습니다. 메서드가 내 스레드에서 호출 될 때 주 스레드가 작업을 마칠 때까지 스레드가 중단됩니다.
어째서? 보시다시피, 나는이 프로 시저를 호출하기 위해 Synchronize() 메서드를 사용하지 않습니다. 따라서 내 스레드가 주 스레드와 동기화 될 것으로 기대하지 않습니다. 그것은 암묵적으로 일어날 것인가? BTW, 모든 GUI 구성 요소는 다른 스레드가 아닌 주 스레드에 의해 액세스되어서는 안되기 때문에 Synchronize 메서드를 사용해야하지만 지금은 몇 가지 빠른 테스트 만하고 있습니다.
WaitForSingleObject 제목으로 되돌아 가면 사용할 수 없다는 것을 알지만 테스트 덕분에 (우연히) 문제를 발견했습니다.
도움 주셔서 감사합니다. 만약 당신이 나를 도와주지 않는다면, 아마도 메시징을 제거하고 대신 이벤트를 사용할 것입니다. 그리고 마침내 그것이 이유가 아님을 알게 될 것입니다 :-).
스레드에서 동기화()를 사용합니까? – mghie