메시지를 처리하는 스레드를 기반으로하는 메시지 큐가 있습니다. 스레드의 일부 활동은 VCL 명령 일 수 있으므로 동기화에서 수행됩니다. Synchronize가 호출되면 스레드가 중지됩니다. 샘플 코드 :동기화가 스레드를 멈추는 것처럼 보입니다.
TMessageQ = class (TThread)
...
procedure TMessageQ.do_msg;
begin
case CurrentMessage.Command of
cQSize: if Assigned (OnSize) then OnSize (CurrentMessage);
cQReady: if Assigned (OnReady) then OnReady (CurrentMessage);
end; // case
end; // do_msg/
procedure TMessageQ.doTask (Sender: TObject);
begin
while FQ.Count > 0 do
begin
FSection.Enter;
try
CurrentMessage := FQ.Dequeue;
finally
FSection.Leave;
end; // try..finally
Synchronize (do_msg);
end; // while
end; // doTask //
do_msg의 명령문은 처리되지 않습니다. 누군가 내가 뭘 잘못하고 있는지 알아?
주 스레드에서 어떤 현상이 발생합니까? 동기화에는 MessageLoop이 필요합니다. 메인 쓰레드가이 쓰레드를 기다리고 있다면 그것은 알 수 있습니다. –
+1 행크 - 죽은 델파이 애플리케이션에 대한 # 1 이유 파악 - TThread.Synchronize 및 (아마도) TThread.WaitFor(). 행크 (Hank)가 말했듯이, GUI 스레드에서 무엇을 하든지, 그 일을 그만두고 이벤트 핸들러를 종료하고 메시지 처리를 다시 시작합니다. 이 단계에서 문구 'Application.ProcessMessages'가 뇌를 통과 할 경우 - 퍼지하십시오. –
나는 당신이 옳다는 것을 두려워합니다 (아래 comemnt 참조). 그리고 Application.ProcessMessages :-)에 대한 경고에 감사드립니다. 나는 이것을 저녁에 시험 할 것이다. – Arnold