쓰레드를 이용해서 프로그램을 짰는데
잘 작동하다가 가끔씩 죽는 경향이 있어서요....
쓰레드에서 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 ;
쓰레드 내부에서 대화상자를 사용하는건 별로 추천해 드리고 싶지 않네요.
아래의 코드를 약간만 수정하면 될것 같습니다.
// 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 ;
이런식으로 하면 될것 같습니다.
그럼, 즐프~