Delphi Thread
Dengan thread, aplikasi dapat mengerjakan satu atau lebih perintah secara bersama, dalam artian perintah satu tidak menunggu selesainya perintah sebelumnya bila akan dikerjakan. Variabel-variabel dalam tiap perintah dapat independen dan tidak saling mengganggu untuk tiap-tiap perintah yang ada. Sistem operasi yang mendukung multitasking mengijinkan perintah-perintah dikerjakan secara bersamaan dengan thread.
Thread dipakai bila:
- diperlukan proses-proses yang independent, misalnya : hardware pooling, animasi obyek
- aplikasi dengan multiprosessor
- diperlukan proses ‘idle’ dalam waktu kerjanya
- ingin belajar thread tentunya..
Contoh sederhana ini menggunakan tiga thread yang masing-masing melakukan counter mandiri dari 0 ke 100000
Inisialisasi thread :
type
TThreadSatu = class(TThread)
private
VarLokal: Integer;
protected
public
constructor CreateIt;
procedure Execute; override;
destructor Destroy; override;
end;
TThreadDua = class(TThread)
private
VarLokal: Integer;
protected
public
constructor CreateIt;
procedure Execute; override;
destructor Destroy; override;
end;
TThreadTiga = class(TThread)
private
VarLokal: Integer;
protected
public
constructor CreateIt;
procedure Execute; override;
destructor Destroy; override;
end;
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure pesan1(Sender:TObject);
procedure pesan2(Sender:TObject);
procedure pesan3(Sender:TObject);
private
CriticalSection: TCriticalSection;
tred1:TThreadSatu;
tred2:TThreadDua;
tred3:TThreadTiga;
public
end;
Jangan lupa menjabarkan constructor, destructor dan executenya :
constructor TThreadSatu.CreateIt;
begin
inherited Create(true); // thread di suspend dulu
FreeOnTerminate:=true;
Form1.Label3.Caption:='';
Suspended:=false; // suspend dilepas, thread dieksekusi
end;
constructor TThreadDua.CreateIt;
begin
inherited Create(true); // thread di suspend dulu
FreeOnTerminate:=true;
Form1.Label4.Caption:='';
Suspended:=false; // suspend dilepas, thread dieksekusi
end;
constructor TThreadTiga.CreateIt;
begin
inherited Create(true); // thread di suspend dulu
FreeOnTerminate:=true;
Form1.Label6.Caption:='';
Suspended:=false; // suspend dilepas, thread dieksekusi
end;
procedure TThreadSatu.Execute;
begin
repeat
Form1.CriticalSection.Acquire;
try
Application.ProcessMessages;
Inc(VarLokal);
Form1.Label1.Caption:=inttostr(VarLokal);
finally
Form1.CriticalSection.Release;
end;
until VarLokal=100000;
end;
procedure TThreadDua.Execute;
begin
repeat
Form1.CriticalSection.Acquire;
try
Application.ProcessMessages;
Inc(VarLokal);
Form1.Label2.Caption:=inttostr(VarLokal);
finally
Form1.CriticalSection.Release;
end;
until VarLokal=100000;
end;
procedure TThreadTiga.Execute;
begin
repeat
Form1.CriticalSection.Acquire;
try
Application.ProcessMessages;
Inc(VarLokal);
Form1.Label5.Caption:=inttostr(VarLokal);
finally
Form1.CriticalSection.Release;
end;
until VarLokal=100000;
end;
destructor TThreadSatu.Destroy;
begin
inherited Destroy;
end;
destructor TThreadDua.Destroy;
begin
inherited Destroy;
end;
destructor TThreadTiga.Destroy;
begin
inherited Destroy;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CriticalSection:=TCriticalSection.Create; // Critical Section dibuat
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CriticalSection.Free; // Critical Section dilepas
end;
procedure TForm1.pesan1(Sender:TObject);
begin
Label3.Caption:='Thread satu selesai';
end;
procedure TForm1.pesan2(Sender:TObject);
begin
Label4.Caption:='Thread dua selesai';
end;
procedure TForm1.pesan3(Sender:TObject);
begin
Label6.Caption:='Thread tiga selesai';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tred1:=TThreadSatu.CreateIt;
tred1.OnTerminate:=pesan1; // tred1 utk akhir operasinya berada di proses pesan1
tred2:=TThreadDua.CreateIt;
tred2.OnTerminate:=pesan2; // tred2 utk akhir operasinya berada di proses pesan2
tred3:=TThreadTiga.CreateIt;
tred3.OnTerminate:=pesan3; // tred3 utk akhir operasinya berada di proses pesan3
end;
CriticalSection dipakai bila thread mengakses variabel global, kelas TCriticalSection memerlukan “SyncObjs” di deklarasi global uses
makasih atas source nya…
Thread di Delphi memang sangat diperlukan untuk programming yang berhubungan dengan hardware (interfacing), proses handshaking dan transfer data. Bisa juga sih diakalin dengan timer tetapi bila yang dipantau sangat banyak interface dan atau proses yang berjalan sangat banyak maka komputer bisa macet karena hanya memperhatikan looping program kita.
Setuju dengan Pak Konang, program akan seperti hang / freeze saat melakukan looping yg lama.
Bagaimana cara Sinkronisasi Thread?
btw thanks buat tutotialnya