Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15441] Re:스레드 안의 Sleep...
조대현.Clau [casanebula] 3491 읽음    2015-03-28 23:04
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)을 주면 메인폼이 얼어버리는데 어떻게 처리 해야 하나요?
:
: 스레드에 함수를 하나 만들어서 메인폼에서 비동기 방식으로 호출을 하는 방법은 없나요?
:
: 아무리 봐도 스레드랑 친해지기는 어려워요 ㅜㅜ

+ -

관련 글 리스트
15438 스레드 안의 Sleep... 우기 2074 2015/03/26
15441     Re:스레드 안의 Sleep... 조대현.Clau 3491 2015/03/28
15439     Re:스레드 안의 Sleep... 델초보 2268 2015/03/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.