[210423] Thread 주의사항

Donghee Lee·2021년 4월 23일
0

Delphi

목록 보기
4/13

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()의 사용을 최대한으로 줄여야
할 것

profile
Better than Yesterday

0개의 댓글