Memanfaatkan Thread untuk proses yang lama
Kadangkala aplikasi kita mengerjakan sesuatu yang membutuhkan hasil yang lumayan lama. Akibatnya aplikasi kita kelihatan hang, dan pengguna aplikasi jadi merasa terganggu.
Saya pernah mengalami hal itu, saat sedang query yang cukup kompleks ke server. Atau ada juga aplikasi yang sedang berkomunikasi ke server melalui internet, menunggu respon server yang lumayan lama. Sehingga aplikasi kita kelihatan hang.
Untuk mengatasi itu saya mengakalinya dengan membuat obyek Thread di memory. Dan pekerjaan yang sering membutuhkan waktu tersebut diberikan kepadanya. Saya berikan contoh bagaimana saya memanfaatkan Thread pada Delphi. Namun ini juga dapat diterapkan pada Lazarus/FreePascal dengan sedikit perubahan.
Saya pernah mengalami hal itu, saat sedang query yang cukup kompleks ke server. Atau ada juga aplikasi yang sedang berkomunikasi ke server melalui internet, menunggu respon server yang lumayan lama. Sehingga aplikasi kita kelihatan hang.
Untuk mengatasi itu saya mengakalinya dengan membuat obyek Thread di memory. Dan pekerjaan yang sering membutuhkan waktu tersebut diberikan kepadanya. Saya berikan contoh bagaimana saya memanfaatkan Thread pada Delphi. Namun ini juga dapat diterapkan pada Lazarus/FreePascal dengan sedikit perubahan.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection,
StdCtrls, Grids, DBGrids, ExtCtrls;
type
TExec = class(TThread) // kelas turunan TThread
protected
procedure Execute; override;
end;
TForm1 = class(TForm)
ZConnection1: TZConnection;
ZQuery1: TZQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Memo1: TMemo;
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
Exec: TExec;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
PesanTunggu;
{$R *.dfm}
procedure TExec.Execute;
begin
// mencoba query ke server melalui sebuah thread
with Form1 do begin
if zquery1.Active then zquery1.close;
ZQuery1.SQL:=Memo1.Lines;
FormTunggu.Visible:=true;
zquery1.Open;
FormTunggu.Visible:=false;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Exec:=TExec.Create(False); // disini procedure TExec.Execute akan dieksekusi
Exec.FreeOnTerminate:=true; // memberitahu obyek Exec agar menghapus instansi dari memory jika query selesai
end;
end.- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, Buttons, Grids, DBGrids, DB, ADODB;
-
- type
- TForm1 = class(TForm)
- ADOConnection1: TADOConnection;
- ADOQuery1: TADOQuery;
- ADOQuery2: TADOQuery;
- DataSource1: TDataSource;
- DataSource2: TDataSource;
- DBGrid1: TDBGrid;
- DBGrid2: TDBGrid;
- BitBtn1: TBitBtn;
- Button1: TButton;
- procedure BitBtn1Click(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- //Thread class declaration - very simple
- TQThread = class(TThread)
- private
- FQuery: TADOQuery;
- protected
- procedure Execute; override;
- public
- constructor Create(Query: TADOQuery);
- end;
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- uses DateUtils;
-
- constructor TQThread.Create(Query: TadoQuery);
- begin
- inherited Create(True); //Create thread in a suspendend state so we can prepare vars
- FQuery := Query; //Set up local query var to be executed.
- FreeOnTerminate := True; //Free thread when finished executing
- Resume;
- end;
-
- procedure TQThread.Execute;
- begin
- FQuery.DisableControls;
- FQuery.Open; //Perform the query
- FQuery.EnableControls;
- end;
-
- procedure TForm1.BitBtn1Click(Sender: TObject);
- begin
- // ujicoba menggunakan query dibuka seperti biasa (sequential)
- ADOQuery1.Open;
- ADOQuery2.Open;
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- // ujicoba menggunakan thread
- TQThread.Create(ADOQuery1);
- TQThread.Create(ADOQuery2);
- end;
-
- end.

<< Beranda