Programming Learning

Free IT e-learning

[Delphi] Berkenalan dengan Thread

Di Tutorial ini saya akan akan mengajak temen-temen untuk berkenalan dengan thread, sebelum memulai pengkodeannya terlebih dahulu kita harus mengetahui sebenarnya apa itu thread, pengertian ini dikutip dari http://wikipedia.org :

Ulir atau thread (singkatan dari “thread of execution“) dalam ilmu komputer, diartikan sebagai sekumpulan perintah (instruksi) yang dapat dilaksanakan (dieksekusi) secara sejajar dengan ulir lainnya, dengan menggunakan cara time slice (ketika satu CPU melakukan perpindahan antara satu ulir ke ulir lainnya) atau multiprocess (ketika ulir-ulir tersebut dilaksanakan oleh CPU yang berbeda dalam satu sistem). Ulir sebenarnya mirip dengan proses, tapi cara berbagi sumber daya antara proses dengan ulir sangat berbeda. Multiplethread dapat dilaksanakan secara sejajar pada sistem komputer. Secara umum multithreading melakukan time-slicing (sama dengan time-division multipleks), di mana sebuah CPU bekerja pada ulir yang berbeda, di mana suatu kasus ditangani tidak sepenuhnya secara serempak, untuk CPU tunggal pada dasarnya benar-benar melakukan sebuah pekerjaan pada satu waktu. Teknik penggantian (switching) ini memungkinkan CPU seolah-olah bekerja secara serempak.

nah, apabila telah paham akan pengertian sebuah thread rasanya tidak komplit apabila saya tidak mencontohkan / mengimplementasikannya. sebelumnya bagi temen-temen yang belum mengerti tentang pembuatan suatu class karena ini akan mengeksploitasi kemampuan pembuatan class silahkan belajar dulu cara membuat class di sini. baik pertama kita buat rancangan form sebagai berikut :

Design Form

isi dari form tersebut hanya 5 panel,5 button dan 5 progressbar dan khusus untuk button dan progressbar namanya adalah untuk button : btn1,btn2,btn3,dst dan progressbar : pb1,pb2,pb3,dst.

Pertama-tama kita buat terlebih dahulu suatu class TThreadButton yang akan kita gunakan untuk mendefinisikan antara button dengan thread, class TThreadButton merupakan class turunan dari TButton, kita letakkan di atas class TForm itu sendiri, pendeklarasiannya adalah sebagai berikut :


TThreadButton = class(TButton)
aThread: TThread;
end;

kemudian selanjutnya kita buat suatu thread yang kali ini saya beri nama TthCounter yang pendeklarasiannya adalah sebagai berikut :


TthCounter = class(TThread)
 private
  FMax,FCounter: integer;
  FCurr: Extended;
  FOwnerButton: TThreadButton;
  FProgressBar: TProgressBar;
  procedure SetOwnerButton(const aButton: TThreadButton);
  procedure SetProgressBar(const aProgressbar: TProgressBar);
  procedure StepProgress;
  { Private declarations }
 protected
  procedure Execute; override;
 public
  constructor Create(CreateSuspended: boolean);
  property ProgressBar: TProgressBar read FProgressBar write SetProgressBar;
  property OwnerButton: TThreadButton read FOwnerButton write SetOwnerButton;
end;

dan sintak terusan untuk class TthCounter adalah sebagai berikut :


constructor TthCounter.Create(CreateSuspended: boolean);
begin
 inherited;
 FCounter                    := 0; //step awal kita beri nilai 0
 FMax                        := MAXINT; //maksimal step adalah nilai dari maksimal tipe integer
 FreeOnTerminate             := True; //lepaskan thread apabila terdeteksi ada pengakhiran aplikasi
end;

procedure TthCounter.Execute;
begin
 ProgressBar.Position          := 0;
 while ProgressBar.Position < 100 do
  begin
   StepProgress; //gunakan synchronize untuk pemanggilan suatu method
                //yang berhubungan dengan objek

   inc(FCounter,50000); //tambahkan nilai variabel FCounter sebanyak 50000
  end;

 OwnerButton.Caption := '&Start';
 OwnerButton.aThread := nil;
end;

procedure TthCounter.SetOwnerButton(const aButton: TThreadButton);
begin
 FOwnerButton := aButton;
end;

procedure TthCounter.SetProgressBar(const aProgressbar: TProgressBar);
begin
 FProgressBar := aProgressbar;
end;

procedure TthCounter.StepProgress;
begin
 FCurr                 := (FCounter / FMax); //posisi sekarang
 ProgressBar.Position  := Round(FCurr * 100); //masukkan posisi progressbar
end;

Selanjutnya pada Form kita buat prosedur yang nantinya berfungsi untuk memanggil thread tersebut, deklarasinya adalah sebagai berikut :


procedure ClickButton(aProgressBar: TProgressBar ; Sender: TObject);

dan sintak penerusnya adalah


procedure TfrmMain.ClickButton(aProgressBar: TProgressBar ; Sender: TObject);
var
 aButton: TThreadButton;
 aThread: TthCounter;
begin
 aButton := TThreadButton(Sender); //definiskan aButton sesuai dengan pengirim perintah
 if not Assigned(aButton.aThread) then  //jika thread milik aButton belum terisi maka
  begin
   aThread                     := TthCounter.Create(True); //buat thread baru
   aProgressBar.DoubleBuffered := True; //supaya progressbar tidak flicker
   aThread.ProgressBar         := aProgressBar; //definisikan progressbar
   aButton.aThread             := aThread; //beri nilai thread milik aButton dgn thread deklarasi
   aThread.OwnerButton         := aButton; //isi properti thread
   aThread.Resume; //jalankan thread
   aButton.Caption             := '&Pause'; //ubah caption tombol
  end
else  //kondisi bahwa thread milik aButton telah terisi
 begin
  if aButton.aThread.Suspended then //apabila posisi suspend maka
   begin
    aButton.aThread.Resume; //jalankan ulang thread
    aButton.Caption := '&Pause'; //ubah caption
   end
  else  //apabila thread sedang berjalan maka
   begin
    aButton.aThread.Suspend; //suspend thread
    aButton.Caption := '&Resume';//ubah caption
   end;
end;
end;

Nah untuk event tiap-tiap button adalah sebagai berikut :

  • OnClick Btn1
ClickButton(pb1,btn1);
  • OnClick Btn2
ClickButton(pb2,btn2);
  • OnClick Btn3
ClickButton(pb3,btn3);
  • OnClick Btn4
ClickButton(pb4,btn4);
  • OnClick Btn5
ClickButton(pb5,btn5);

Nah apabila telah mengikuti langkah – langkah seperti di atas kita jalankan aplikasi yang telah kita buat dan apabila benar maka hasilnya adalah sebagai berikut :

Hasil Compile

Bagi temen-temen yang belum jelas atau malah belum jalan, dapat mendownload project lengkapnya disini

Demikian tutorial ini, semoga dapat memberikan wawasan baru bagi temen-temen semua.

2 responses to “[Delphi] Berkenalan dengan Thread

  1. Adi Nugroho Agustus 6, 2009 pukul 7:42 am

    Mas, jika implementasi thread ini pada saat proses menjalankan store procedure yg kompleks sehingga memerlukan waktu, gimana cara ?
    Karena tidak bisa diketahui nilai max nya.

    Jika memungkinkan mohon dibalas juga via email saya.
    Trims.

  2. mbahdien November 16, 2009 pukul 3:37 am

    krn stored procedure jalannya di server, jadi kita nggak bisa nglaksanain thread di Delphi. untuk menjamin konkurensi data di stored procedure pake transaction aja bukan pake thread.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: