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.
혹은
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초 정도)
Thread에서 Synchronize(=동기화 시킨다)라는 말의 의미는
-> "둘이 동시에 같은 일을 하지 못하도록 하는 것"
하지만 임계영역으로 동기화 시킬 수 없는 부분이 있다.
-> VCL
동기화 없이 GUI에 관계된 일을 수행하면 화면이 얼어붙는 프리징 현상이 나타남
-> GUI에 직접 관여하지 않을 것!
-> VCL의 TControl 클래스로부터 상속받은 놈들은 Thread 안에서 사용하지 않는 것
-> 사용할 일이 있더라도 직접 건드리지 말고 GUI와 친한 Main Thread에 넘기자
-> Synchronize 사용!
Suspend와 Resume
-> Thread를 잠시 멈추고 다시 시작함
-> TThread는 Thread 강제종료 기능을 제공하고 있지 않음
-> Suspend가 호출되는 순간 Thread는 딱 멈춰버림
-> Suspend와 Resume는 짝이 맞아야함 (1:1, 2:2, 3:3...)
-> Suspend가 Sleep보다 유용한 이유는 Sleep이 CPU의 쥐꼬리만큼 시간을 잡아먹는데 비해 Suspend는 CPU의 낭비가 전혀 없다는 점