2014-02-23 1 views
4

내가 이해 한대로 TThread의 Synchronize를 호출하면 동기화 된 코드가 주 스레드에서 실행 된 것처럼 실행됩니다. , 보조 스레드에서TThread의 동작 동기화

procedure TForm3.Button1Click(Sender: TObject); 
var 
A, B, C : String; 
begin 
A := 'test1'; 
B := 'test2'; 
C := 'test3'; 
Button1.Enabled := false; 
end; 

나는 다음과 같은 코드가 있습니다 :의 내 메인 스레드에서, 나는 하나 개의 버튼을한다고 가정 해 봅시다

procedure TestThread.ChangeButton1; 
begin 
Form3.Button1.Enabled := true; 
end; 

(코드 자체에주의를 지불하지 마십시오 - 그냥 예입니다 그것은 하지를 아무 뜻입니다.)

내가 마우스 오른쪽 후 Button1을를 클릭 한 말, 동안 Button1Click이라 실행 중입니다. TestThread는 을 호출합니다. 동기화 (ChangeButton1); ChangeButton1이 주 스레드에 의해 실행될 때를 알 수 있습니까? 그렇다면 Button1Click이 모두 실행 된 것입니다. 또는 절차 내에서 네 가지 작업 중 하나 일 수 있습니까?

죄송 합니다만 바보 같은 질문입니다. 그 질문에 대한 답을 찾을 수 없었습니다. 동기화 절차가 어떻게 작동하는지 더 잘 이해할 수 있습니다.

감사합니다.

답변

5

어리석은 질문이 아닙니다.

실제로 동기화는 주 스레드로 일시적으로 전환되므로 '있는 그대로'는 아닙니다. 코드는 문자 그대로 주 스레드에서 실행됩니다. Synchronize가 호출 될 때 주 스레드가 무언가를하면 Synchronize 호출은 주 스레드가 유휴 상태가 될 때까지 기다려야합니다. 마찬가지로 동기화 된 호출이 실행중인 경우 주 스레드에서 수행해야하는 다른 작업은 동기화 된 호출이 완료 될 때까지 대기해야합니다.

따라서이 시나리오에서는 다른 작업으로 전환 할 중간 작업을 방해하지 않습니다.

7

Synchronize() 대기열에 요청을 넣은 다음 메시지가 주 메시지 대기열에 게시되어 동기화 대기열이 보류 중임을 알립니다. 기본 메시지 루프가 해당 메시지를 처리하면 Synchronize() 코드가 실행됩니다. Button1Click()도 창 메시지에 의해 트리거되므로 Button1Click()이 실행되는 동안 기본 메시지 루프가 차단됩니다. 이 시간 동안 Synchronize()이 호출되면 제어는 주 메시지 루프로 반환 될 때까지 동기화 된 코드가 실행되지 않습니다. 따라서 귀하의 질문에 대한 답변을 이 실행되고 종료 된 후 Button1Click()이 실행됩니다.