[210422] Thread 기본 예제

Donghee Lee·2021년 4월 22일
0

Delphi

목록 보기
1/13

Delphi Thread 기본 예제

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private  }
  public
    { Public  }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}


var ImpThread : TImpThread;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ImpThread := TImpThread.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ImpThread.Terminate;
  ImpThread.Free;

end;

end.
unit Unit2;

interface

uses
  Classes, Sysutils;

type
  TImpThread = class(TThread)
  public
    constructor Create;
  private
    qq : integer;
  protected
    procedure Execute; override;
    procedure ShowStatus;
  end;

implementation

uses Unit1;

constructor TImpThread.Create;
begin
  inherited Create(false);	
  //Create 생성자의 파라미터가 false -> 생성 즉시 실행, 
  //만약 True로 넘겨준다면 Resume 함수를 호출해서 명시적으로 쓰레드를 호출할 수 있다
  Priority := tpTimeCritical;
end;

procedure TImpThread.Execute;
begin
  qq := 0;
  while not Terminated do
  begin
    Inc(qq);
    if qq mod 100 = 0 then
      Synchronize(ShowStatus);
  end;
end;

procedure TImpThread.ShowStatus;
begin
  Form1.Caption := inttostr(qq);
end;


end.
  1. 델파이는 override 된 함수에는 자동을 inherited를 만들어 주기 때문에 제거
  2. for문이 끝나면 자동으로 Thread는 종료(Terminate)되지만 생성된 Instance가 파괴(Destroy)되는 것은 아님
    -> FreeOnTerminate를 True로 설정해두는 경우에는 Thread 종료 시 자동으로 Instance가 파괴
    -> 그렇지 않을 경우 Free로 파괴

혹은

procedure TThreadA.Execute;

var
  I, J : Integer;

begin
  for I:=1 to 30 do begin
    **if Terminated then Break;**
    PostMessage(FOwner, WM_USER, GetTickCount(), 0);
    for J:=1 to 10 do begin
      **if Terminated then Break;**
      Sleep(100);
      end;
    end;
end;

와 같이 사용하는 방법도 있다 (종료 딜레이 0.1초 정도)

  1. Thread에서 Synchronize(=동기화 시킨다)라는 말의 의미는
    -> "둘이 동시에 같은 일을 하지 못하도록 하는 것"
    하지만 임계영역으로 동기화 시킬 수 없는 부분이 있다.
    -> VCL
    동기화 없이 GUI에 관계된 일을 수행하면 화면이 얼어붙는 프리징 현상이 나타남
    -> GUI에 직접 관여하지 않을 것!
    -> VCL의 TControl 클래스로부터 상속받은 놈들은 Thread 안에서 사용하지 않는 것
    -> 사용할 일이 있더라도 직접 건드리지 말고 GUI와 친한 Main Thread에 넘기자
    -> Synchronize 사용!

  2. Suspend와 Resume
    -> Thread를 잠시 멈추고 다시 시작함
    -> TThread는 Thread 강제종료 기능을 제공하고 있지 않음
    -> Suspend가 호출되는 순간 Thread는 딱 멈춰버림
    -> Suspend와 Resume는 짝이 맞아야함 (1:1, 2:2, 3:3...)
    -> Suspend가 Sleep보다 유용한 이유는 Sleep이 CPU의 쥐꼬리만큼 시간을 잡아먹는데 비해 Suspend는 CPU의 낭비가 전혀 없다는 점

profile
Better than Yesterday

0개의 댓글