Execute Query dengan Thread (Thread query)

on Senin, 28 September 2009

Kadang, karena suatu hal kita ingin memakai/ membuat procedure yang mampu melakukan eksekusi query dengan menggunakan thread agar prosesnya terpisah dari main thread (thread aplikasi) untuk alasan kecepatan eksekusi. Ini dapat terjadi bila anda loading data yang lumayan besar dan menampilkannya dalam grid. Berikut ini adalah contoh thread untuk mengeksekusi query (general query executor) yang bersifat dinamis.

unit Test;
unit Test;
interface
uses
  Windows, IBQuery, …, … ;   
  //Tambahkan Disini No : 1
Type
  TQryRefreshThread = class(TThread)
  . . .
  End;
  . . .
Type
  TtestForm : Class(TForm)
  . . .
  End;
  //Tambahkan Disini No : 2  

  Var
  . . .
Implementation
{$R *.dfm}
  //Tambahkan Disini No : 3

Tambahkan kode dibawah pada deklarasi tipe
Pada bagian


Code No.1 :

{mmmmm   THREAD QUERY   mmmmm}
type
 TQryRefreshThread = class(TThread)
 private
   AIBQuery : TIBQuery; // Ganti TIBquery sesuai dengan SQL Component yang anda gunakan

   ACommand : String;
   procedure RefreshData;
 protected
   procedure Create(const FIBQuery : TIBQuery;const FCommand: string);
   procedure Execute;override;
 public
 end;



Tambahkan deklarasi procedure dibawah setelah deklarasi tipe (diatas deklarasi var /variable global) pada unit anda.

Code No. 2:
procedure ExecThreadSql(AIBQuery: TIBQuery; ACommand: String);


Tambahkan kode dibawah setelah bagian Implementation

Code No. 3 :

{ TRefreshQryThread }
procedure TQryRefreshThread.Create(const FIBQuery: TIBQuery;
 const FCommand: string);
begin
 inherited Create(true);
 AIBQuery := FIBQuery;
 ACommand := FCommand;
 Resume;
end;

procedure TQryRefreshThread.Execute;
begin
 //inherited;
 FreeOnTerminate := true;
 Synchronize(RefreshData);
end;

procedure TQryRefreshThread.RefreshData;
begin
 with AIBQuery do begin
   Close;
   SQL.Clear;
   SQL.Add(ACommand);
   Prepare;
   Open;
 end;
end;


{mmmmm   Procedure Untuk menyederhanakan pemanggilan ThreadQuery   mmmmm}
procedure ExecThreadSql(AIBQuery: TIBQuery; ACommand: String);
var
 MyThread : TQryRefreshThread;
begin
 try
   MyThread := TQryRefreshThread.Create(AIBQuery, ACommand);
   with MyThread do begin
     FSqlCommand := ACommand;
     FIBQry := AIBQuery;
     if MyThread.Suspended then
       MyThread.Resume;
   end;
 except On E:Exception do
   raise Exception.Create(e.Message);
 end;
end;



Cara penggunaanya :

ExecThreadSql(BarangQry, 'SELECT Kode,Nama,Stok,Harga FROM TabelBarang ORDER BY Nama');

2 komentar:

Cecep Saefulloh mengatakan...

MAS ketika procedure ExecThreadSql pada baris MyThread := TQryRefreshThread.Create(true); ada error karena methode Create beda tipe antara TIBQuery dengan boolean

Reshi Mahendra mengatakan...

@Cecep Saefulloh :
Terima kasih atas masukannya mas cecep. Iya disana ada kesalahan parameter. Saya sudah melakukan edit pada baris yang bersangkutan.

Salam,

Reshi Mahendra

Posting Komentar