먼저 번에 질문을 드렸었는데 제가 원하는 해결방법이 아닌것 같아서 다시 질문드립니다.
쓰레드를 이용해서 프로그램을 짰는데
잘 작동하다가 가끔씩 죽는 경향이 있어서요....
쓰레드에서 MessageBox를 띄울때는 Sychronize를 사용해야한다고 알고 있는데요, 어떤 버튼을
클릭했는냐에 따라서 쓰레드를 계속할지, 중지할지를 결정하기위해서 MessageDlg를 사용해야했습니다.
Synchronize는 리턴값을 받지못하고 procedure를
인자로 사용하기 때문에 Synchronize를 사용하지 못했습니다.
메인에 종속된 MessageDlg 가 아니고 쓰레드자체에서 루프를 돌지 안돌지를 결정하는 쓰레드의 MessagesDlg이기 때문에 괜찮을 것 같기도 한데... (아닌가요? 무조건 Sychronize를 써야하나요?)
혹, Sychronize 나 다른 Method를 사용해서 MessageDlg의 버튼값으로 루프를 진행하거나
그만 둘 수 있게 하는 방법이 있는지 궁금합니다.
고수님의 도움이 절실히 필요합니다....
도와주세용.....
프로그램을 간단히 설명하면 다음과 같습니다.
쓰레드 내부에서 두개의 버퍼 값을 비교하는 루틴이 있기 때문에 MessageDlg를 쓰레드 내부에서
띄어야 합니다...
값이 다른 경우에 계속 비교할지, 여기서 그만 둘지를 어떤 버튼을 누르는가에 따라서 결정하고 싶거든요....
쓰레드는 for 루프를 돌면서 MessageDlg를
띄어줍니다. OK 버튼을 클릭하면 루프를 계속돌고
Cancel을 클릭하면 루프를 빠져나가게 합니다.
// Thread 부분
procedure TMyThread.Execute ;
var
I : integer ;
aStr , TrgStr: string ;
begin
aStr := 'abcdefg' ;
TrgStr := 'abcwxyz' ;
for I:= 1 To Length(TrgStr) do begin
if aStr[I] <> TrgStr[I] then begin
case MessageDlg('계속하시겠습니까?',mtInformation, [mbOK,mbCancel],0) of
mrCancel : break ;
end ;
end ;
end ;
end ;
end ;
// Main 함수부분
procedure TMainFn.Button1OnClick(Sender : TObject) ;
begin
TMyThread.Create() ;
end ;
지금 싱크로 나이즈를 써보고 했는데요..
되는군요 싱크로 나이즈를 쓰지 않으면 에러가 나구요.
제생각엔 싱크로 나이즈를 오해 하신거 같습니다.
procedure threadtest.Execute;
begin
Synchronize(UpdateCaption);
freeonterminate := True;
end;
procedure threadtest.UpdateCaption;
begin
if MessageDlg('계속하시겠습니까?',mtInformation, [mbOK,mbCancel],0) = 1 then
Form1.Caption := 'Updated in a thread';
end;
이런식의 구조거든요.
혹시나 해서 excute에 들어가는 부분을 모조리 프로시져 하나로 떼어내시고
위처럼 코딩하면 에러가 안나더라구요 정확한 이유는 모르겠습니다.
싱크로나이즈란
main vcl thread 에서 돌아가게 한다고 하고 충돌을 피해준다는데..
충돌을 피해주는건 아는데 왜 messagedlg가 에러가 안나는지
그리고 스텝을 밟아가면서 하면 또 에러가 안나더라구요..
이것참 신기하네요..
또 찾아보니..이런말이 있네요..
Most methods that access a VCL object and update a form must only be called from within the main VCL thread.
그리고 TThread는
TThread = class VCL에서 파생된건 아니네요..이러니
아무래도 정확한 원인을 알기전에는 싱크로나이즈를 써야 겠다 하는 생각이
드네요..과연 main vcl thread가 뭔지는 모르겠지만..
싱크로 나이즈 함수를 보니.
SendMessage(ThreadWindow, CM_EXECPROC, 0, Longint(Self));
이런게 있네요..스레드는 window가 없으니깐 윈도우를 만들어주는것 같
습니다.안보이는 윈도우 겠죠...아 확실히 정리는 안되는데..
대충 위처럼 추측을 해봅니다. 님께서도 한번 찾아보세요..