//
// 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 함수를 호출하면
프로그램에 문제가 생겨서 프로그램이 정지 한다