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