Q&A

  • 쓰레드에서 MessageDlg 뿌리기

쓰레드를 이용해서  프로그램을 짰는데
잘 작동하다가 가끔씩 죽는 경향이 있어서요....

쓰레드에서 MessageBox를 띄울때는 Sychronize를 사용해야한다고 알고 있는데요, 어떤 버튼을
클릭했는냐에 따라서 쓰레드를 계속할지, 중지할지를 결정하기위해서 MessageDlg를 사용해야했습니다.
Synchronize는 리턴값을 받지못하고 procedure를
인자로 사용하기 때문에 Synchronize를 사용하지 못했습니다.

메인에 종속된 MessageDlg 가 아니고  쓰레드자체에서 루프를    돌지 안돌지를 결정하는 쓰레드의 MessagesDlg이기 때문에 괜찮을 것 같기도 한데... (아닌가요? 무조건 Sychronize를 써야하나요?)

혹, Sychronize 나 다른 Method를 사용해서 MessageDlg의 버튼값으로 루프를 진행하거나
그만 둘 수 있게 하는 방법이 있는지 궁금합니다.

고수님의 도움이 절실히 필요합니다....
도와주세용.....

프로그램을 간단히 설명하면 다음과  같습니다.
쓰레드는 while 루프를 돌면서 MessageDlg를
띄어줍니다. OK 버튼을 클릭하면 루프를 계속돌고
Cancel을 클릭하면 루프를 빠져나가게 합니다.

// Thread 부분

procedure TMyThread.Execute ;
var
    Loop : integer ;
begin
  
  Loop := 1 ;
  while Loop = 1 then do
  begin
  
       case MessageDlg('계속하시겠습니까?',mtInformation, [mbOK,mbCancel],0)  of
  
           mrCancel : Loop := 0 ;

       end ;
  

  end ;


end ;


// Main 함수부분
procedure TMainFn.Button1OnClick(Sender : TObject) ;
begin

   TMyThread.Create() ;

end ;
2  COMMENTS
  • Profile
    한원희 2004.04.16 20:44
    안녕하세요. 한원희입니다.

    쓰레드 내부에서 대화상자를 사용하는건 별로 추천해 드리고 싶지 않네요.
    아래의 코드를 약간만 수정하면 될것 같습니다.

    // Main 함수부분
    procedure TMainFn.Button1OnClick(Sender : TObject) ;
    begin
      FThread:=TMyThread.Create() ;
      FThread.FreeOnTerminate:=true;
    end ;

    // 스레드를 계속 실행시킬 것인가?
    procedure TMainFn.Button2OnClick(Sender : TObject) ;
    begin
      FThread.Suspend; // 스레드 잠시 멈춤 ( 멈줄 필요가 없다면 빼도 되겠죠.)
      if MessageDlg('계속하시겠습니까?',mtInformation, mbOK,mbCancel],0)=mbCancel then
          FThread.Terminate; // 스레드 종료
      FThread.Resume; // 스레드 계속 실행
    end ;

    // Thread 부분
    procedure TMyThread.Execute ;
    begin
      while true do
      begin
        //  스레드에서 처리할 작업

        if Terminated then
          break;
      end ;
    end ;

    이런식으로 하면 될것 같습니다.

    그럼, 즐프~

  • Profile
    윤상현 2004.04.17 03:02
    답변감사합니다만...
    제가 원하던 방식이 아니군요...

    쓰레드 내부에서 두개의 버퍼 값을 비교하는 루틴이 있기 때문에 MessageDlg를 쓰레드 내부에서
    띄어야 합니다...
    값이 다른 경우에 계속 비교할지, 여기서 그만 둘지를 어떤 버튼을 누르는가에 따라서 결정하고 싶거든요....