Sleep을 동기화인 Syncronize에서 호출하신거 아니신가요?
일반적으로 쓰레드에서 Sleep을 호출하면 메인폼을 얼지 않습니다.
만약 쓰레드에서 Syncronize로 호출하시면 이는 윈도우메세지로 우회하는 방법으로 메인폼에서 실행되게 되는데
여기서 Sleep을 호출하시면 당연히 얼어버립니다.
참고로 XE(정확하게 기억이 안나지만 2009이후였던걸로 압니다) 버전 이후에는 익명함수가 지원되므로
다음과 같이 간단하게 쓰레드를 호출할 수 있습니다.
비동기 처리를 흉내낼 수 있지요.
procedure TForm1.Button1Click(Sender: TObject)
begin
TThread.CreateAnonymousThread(procedure ()
begin
Sleep(5000); // 익명쓰레드 내부에서 실행되므로 메인쓰레드는 얼지않음
TThread.Synchronize (TThread.CurrentThread, procedure ()
begin
Edit1.Text := '1번완료'; // <-------- 쓰레드 내부에서는 컴포넌트의 UI작업은 필히 Synchronize 내부에서 해야한다.
end);
end).Start;
// 단, 이 익명쓰레드는 Terminated(완료)를 검사하지 않고 그 즉시 다음 행으로 넘어감
// 그래서 화면에 먼저 '2번완료'가 표시되고 5초후에 '1번완료'가 표시됨
Edit1.Text := '2번완료';
end;
우기 님이 쓰신 글 :
: 스레드 안에 Sleep를 쓰면 안되나요?
:
: 스레드 안에 임의로 Sleep(1000)을 주면 메인폼이 얼어버리는데 어떻게 처리 해야 하나요?
:
: 스레드에 함수를 하나 만들어서 메인폼에서 비동기 방식으로 호출을 하는 방법은 없나요?
:
: 아무리 봐도 스레드랑 친해지기는 어려워요 ㅜㅜ
|