Q&A

  • 델파이 thread예제의 Synchronize에 대하여
델파이 예제에 보면
C:\Program Files\Borland\Delphi6\Help\Examples\Prgrsbar
예제가 있습니다.
그런데 제 컴퓨터에서 동작을 안하는군요

실행하고 화면의 create thread버튼을 누르면 프로그램이 멈춥니다.
그래서 찾아봤더니

constructor TMyThread.CreateIt(PriorityLevel: cardinal; ProgBar : TProgressBar);
begin
  inherited Create(true);      // Create thread suspended
  Priority := TThreadPriority(PriorityLevel); // Set Priority Level
  FreeOnTerminate := true; // Thread Free Itself when terminated
  PB := ProgBar;    // Set reference
  Synchronize(InitProgressBar); // Setup the ProgressBar --> 여기서 멈춥니다.
  Suspended := false;         // Continue the thread
end;

위 Synchronize(InitProgressBar);이부분을 주석 처리하면 정상적으로 동작합니다.
이유가 궁금합니다.

2  COMMENTS
  • Profile
    라벤더 2005.04.12 20:23


    안녕하세요..

    TThread의 Synchronize 메소드는 VCL을 스레드가 단독으로 사용할 수 있게 해주는 것이죠..

    그런데 메인메소드인 Execute와 함께 작업스레드가 실행이 되면

    메모리 부분에서 당연히 문제가 생기겠죠.. (같은 메모리영역을 차지하므로..)

    그렇기 때문에 VCL을 사용하는 코드를 가진 함수를

    Synchronize메소드로 호출하려면 Execute메소드에서 해주어야합니다.

    TThread에서 가장 이해하기 까다로운 부분이 바로 Synchronize죠..

    저도 아직 100%이해 못했습니다만 -_-;; 도움이 되셨으면 좋겠네요

    그럼 즐코하세요 ^ㅡ^;

  • Profile
    srookie 2005.04.14 20:46
    안녕하세요.
    TThread의 Synchronize Method는 TThread에서 동기화를 맞추기 위해서 TThread 자신은 Block이 되고 Synchronize안의 함수를 Main Thread에서 수행시키게 로직이 되어있습니다.
    현재 보여주신 소스를 보면 생성자에서 Synchronize Method를 수행하게 되어있습니다.
    실제로 CreateIt 이라는 생성자를 호출해주는 곳은 Main Thread일텐데 Main Thread의 생성자 함수 수행이 끝나지 않은 상태에서 Synchorize함수를 호출하면 Dead lock에 빠지는게 당연할 것으로 생각이 되는군요. Main Thread가 Main Thread의 제어권을 갖기를 원하는 것이니까요.
    제가 두서없이 설명을 드렸네요 ^^
    참고가 되시길 바랍니다.
    즐프하세요~