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:
MAS ketika procedure ExecThreadSql pada baris MyThread := TQryRefreshThread.Create(true); ada error karena methode Create beda tipe antara TIBQuery dengan boolean
@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