[210422] Thread 사용 시 주의 사항

Donghee Lee·2021년 4월 22일
0

Delphi

목록 보기
2/13

Thread 사용 시 주의사항

//
// Thread class 정의 예제
//
unit RainbowThread;

interface

uses
  Classes, SysUtils, ExtCtrls;

type
  TRainbowThread = class(TThread)
  private
    { Private declarations }
    FShape : TShape;
  protected
    procedure Execute; override;
  public
    Constructor Create(Shape:TShape);
  end;

implementation

{ TRainbowThread }

procedure TRainbowThread.Execute;
begin
  Repeat
    FShape.Brush.Color:=
      Round(Random(256)) shl 16 +
      Round(Random(256)) shl  8 +
      Round(Random(256));
    Sleep(200);
  Until Terminated = True;  //=====> Terminated 변수의 검사로 진행여부를 결정하도록 처리 한다
end;

Constructor TRainbowThread.Create(Shape:TShape);
Begin
  FShape:= Shape;  //=====> 초기화 처리는 Inherited Create() 함수 보다 먼저 기입 한다

  Inherited Create(True);
End;

end.

//--------------------------------------------------//
// 사용법 1
//--------------------------------------------------//

  // 생성 부분
  // 전달인자가 True 일때는 Resume 호출로 실행 시켜야 한다
  Thread1:= Thread.Create( True ); 

  // 재개
  Thread1.Resume;   

  // 일시 중지
  Thread1.Suspend;  

  // 실행 종료
  Thread1.Terminate;

  // 실행 종료 대기
  Thread1.WaitFor;

  // 제거 부분
  Thread1.Free;  // 또는 FreeAndNil( Thread1 );

--< 주의 >-----------------------------------------
Resume 을 호출하지 않은 상태에서
Suspend를 호출하면 프로그램에 문제가 생겨서
프로그램이 정지 한다

//--------------------------------------------------//
// 사용법 2
//--------------------------------------------------//

  // 생성 부분
  // 전달인자가 False 이면 바로 실행 한다
  // 전달인자가 False 일때 Suspend 함수를 호출하면
  // 프로그램에 문제가 생겨서 프로그램이 정지 한다
  Thread1:= Thread.Create( False );

  // 제거 부분
  Thread1.Free;  // 또는 FreeAndNil( Thread1 );

//--------------------------------------------------//
// 사용법 3
//--------------------------------------------------//

  // 생성 부분
  // 전달인자는 실행 시작 여부
  // True  = Resume 함수 호출로 시작
  // False = 바로 시작
  Thread1:= Thread.Create( True ); 

  // 실행 종료 되면 자동 제거
  Thread1.FreeOnTerminate := True;

  // 실행 종료
  Thread1.Terminate;

--< 주의 >---------------------------------------------
FreeOnTerminate := True; 로 지정한 후에는
Suspend 또는 Free 함수를 호출하면
프로그램에 문제가 생겨서 프로그램이 정지 한다

profile
Better than Yesterday

0개의 댓글