---**쓰레드와 메이폼 버튼 클릭시 사용될 공용 시리얼 출력함수
procedure Tfrom1.Func1(str : string);
begin
with Query1,Query1.SQL do
begin
Close;Clear;
Add('select remark from contents where aaa = '''+str'''');
Open;
while not eof do // while loop가 50회 정도된다면...
begin
Comport.WriteStr( fieldbyname('remark').AsString);
Next;
end;
end;
end;
--** 쓰레드에서시 호출하는 루틴
procedure TMyThread.Execute;
begin
while (not Terminated) do begin
try
Msg := from1.Client1.ReadLn;
if Length(Msg) >= 1 then begin
Synchronize(Func1('Msg'));
except
Terminate;
end;
end;
end;
---**메인 폼에서 버튼클릭시 Func1 사용하는 루틴
procedure Tfrom1.button1Click(sender :Tobject);
begin
Func1('Y');
end;
안녕하세요~
시리얼로 출력을 하는 public 함수 "Func1" 을 쓰레드에서
Synchronize 로 동기화 하여 호출 사용하고
메인폼에서 버튼을 클릭하면 역시 "Func1" 사용할수 있는 환경에서...
쓰레드에서 Func1 호출하여 50회 정도 루프를 돌면서 시리얼로 text를 전송하고 있는 도중에
메인폼에서 버튼을 클릭하여 역시 50회 돌면서 text 를
전송하면 상호 간섭이 발생되지 않을까요?
예를 들면 쓰레드에서 호출한 Func1이 50회를 돌면서 1 ~ 50 까지 숫자를 출력 도중에
난데없이 메인에서 Func1 호출하여 51 ~ 100 까지 숫자
출력호출하면
출력 결과가 1~30 까지 나오고 다음에 51~100까지 나오고
그다음에 31 ~ 50 까지 출력 되는 어이 없는 경우가 발생되지는 않는지?..
물론 1-50까지 출력은 아주 짧은 시간내에 출력이 되기 때문에
별 문제없이 출력 됩니다마는 만약 굉장히 긴 Loop를 돌고 있다면
혹시 상호 간섭으로 섞여 나올수 있을수도 있게다 싶어 여러분들의
조언을 듣고 싶습니다.
만약 이상없이 출력 된다면 혹은 섞여서 출력 되는
문제가 발생되는지 그 원리가 아주 아주 궁금합니다.
말씀하신대로 상호간섭이 발생합니다.
이걸 막으실려면 Critical Section같은것을 이용하세요.
^^ 항상 즐코하세요.