Q&A

  • 쓰레드 안에서 메시지 박스 띄우기..??
쓰레드 내부에서
ShowMessage는 띄울때 문제가 생겨서요..

FTP로 파일 전송을 하는 프로그램을 만들때.

파일 전송시 윈도 핸들을 ftp로 넘어가는 문제를
해결하기 위해서 쓰레드를 사용하였습니다.

쓰레드 내부에서
put을 이용해서 파일을 전송한후
전송완료 메시지를

ShowMessage('파일전송을 완료하였습니다.');

라는 메시지를 뛰워주고

쓰레드가 종료되도록 만들었습니다.

procedure TManualTransThread.Execute;
begin
   try
      FreeOnTerminate := true;
      Client.Put(SrcPath+'\'+FileName, FileName);
      ShowMessage('파일전송을 완료하였습니다.');
   except
      Terminate;
   end;
end;

쓰레드의 Execute 함수 부분입니다..

그런데 어떤 때는 정상 작동하고
어떤때는 메모리 참조 에러 메시지가 막뜨고
어떤 때는 윈도 화면이 넘어가는 엄청난 크기의
메시지 박스가 떠버리는 경우가 발생하네요..

이유가 무엇인지 알려주세요. ^^
2  COMMENTS
  • Profile
    KDDG_BaSTaD 2004.03.27 07:06


    ==> 안녕하세요  BaSTaD 입니다..

    Thread 내부에서 UI관련 작업을 하실때는 Synchronize 를 반드시 해야합니다. 즉 메인 Thread가 아닌 Work Thread에서 말이죠.. UI 는 메인쓰레드에서만 정상적으로 동작합니다.. 되따 않되어따 그러는 이유이지요..

    아래처럼 해보세요..

    procedure TManualTransThread.DoEndOfWork;
    begin
      ShowMessage('작업 종료');
    end;

    .... Execute;
    begin
    ....
    Synchronize(DoEndOfWork);
    end;

    KDDG 만수 ㅔ 이 ~~~
  • Profile
    한원희 2004.03.27 05:53
    안녕하세요. 한원희입니다.

    쓰레드 내부에서 VCL 관련 API를 호출하면 문제가 생깁니다. 데드락이 발생하거나, 메모리 에러 등, 프로그램이 불안해 지죠.
    쓰레드의 Execute의 마지막에서 ShowMessage를 호출하시지 말고, 쓰레드를 생성한 메인에서, 쓰레드를 생성한 다음에 쓰레드의 OnTerminate 이벤트 핸들러를 할당해 주고, 그 핸들러에서 ShowMessage를 하도록 해보세요. 쓰레드 동작이 완료된 후에, OnTerminate가 호출되니, 원하는 동작을 만드실 수있을 겁니다.

    그럼, 즐프~