Thread 사용 중 델파이 VCL(Visual Component Library)의 속성을 변경하려고 하는 건 프로그램의 예기치 못한 종료를 가져올 수 있다
VCL의 처리(눈에 보이는 화면 전환, GUI)는 프로그램의 Main Thread에서 처리하게 되는데 프로그래머가 다른 Thread를 이용해 VCL의 속성을 변경해 버리면 Main Thread에서 오류가 발생할 확률이 엄청 높아진다.
-> GUI를 위해 Thread를 쓰는 건 권장하지 않음
하지만 Delphi를 사용하다 보면 Thread를 사용하지 않고서는 사용자 화면이 모든 작업이 종료되기 전까지는 멈춰있다.
->Thread를 사용하지 않을 수 없음
따라서 안전하게 Thread에서 VCL의 속성을 변경하는 방법을 공부
->이 때 사용할 수 있는 함수는 Syncronize()
procedure TSomeThread.Execute;
begin
Synchronize(UpdateVCL);
end;
procedure TSomeThread.UpdateVCL;
begin
FormMain.Edit1.Text('텍스트 갱신');
end;
여기서 주의할 점은 Syncronize()는 오직 procedure만 가능하며
실행하는 procedure은 넘기는 인자값(parameter)이 없는 procedure만 가능
->즉, 어떠한 것도 넘겨줄 수도, 결과값을 받을 수도 없음
Q1)그렇다면 FormMain.Edit1의 Text를 임의의 값을 변경하려면?
Q2)그리고 제대로 변경되었다면 해당 결과는 어떻게 Thread안에서 확인?
방법은 한 가지로
Ans)임의의 Text 값을 전역변수에 저장한 다음 Syncronize()를 통해 화면 갱신을 하게 되고, 다시 결과를 다른 변수로 확인해야 함
//전역 변수
var
someText : String; //임의의 텍스트 저장
resultProcedure: Boolean; //결과의 저장
procedure TSomeThread.Execute;
begin
//변수에 값을 저장하고
someText := 'SomeText';
//VCL을 갱신
Synchronize(UpdateVCL);
//결과의 확인
if resultProcedure = true then
begin
ShowMessage('변경에 성공 하였습니다.');
end;
end;
procedure TSomeThread.UpdateVCL;
begin
//VCL 변경
FormMain.Edit1.Text(someText);
//변경 결과의 저장
if FormMain.Edit1.Text = 'SomeText' then
begin
resultProcedure := true;
end;
end;
Syncronize()가 실행되는 동안에는 Application의 프로그램 Main Thread가 동작하지 못한다
즉, Main Thread를 멈춰 놓고 해당 작업을 실행하기 때문에 반드시 안정함을 보장할 수 있다.
당연히 Syncronize()의 남발은, Thread를 사용하는 의미를 퇴색시키며 Multi Programming과 거리가 멀어진다.
최대한 프로그래머가 사용하는 Thread는 VCL과는 별개의 다른 작업을 처리하는 작업을 하도록 하여
Syncronize()의 사용을 최대한으로 줄여야 할 것