Select Page

Program yang menggunakan rutin perhitungan looping dengan pengulangan hingga ribuan dapat membuat program kita menjadi tidak merespon terhadap interaksi luar dimana terkadang kita hendak menghentikan proses tersebut misalnya dengan klik tombol “stop process”. Bahkan kalau kita mengintip melalui Task Manager, program terdeteksi seolah-olah “not responding”. Padahal program tersebut sedang sibuk bekerja menyelesaikan tugas perhitungan looping dan tidak mau diganggu oleh siapapun. Kecuali kita melakukan End Task agar Windows memaksa program tersebut ditutup.

Mengutip dari laman SourceForge ada prosedur ProcessMessages untuk membuat program merespon interaksi luar. Mendeklasikannya cukup mudah.

public procedure TApplication.ProcessMessages;

Dimana prosedur Processmessages diletakkan? Prosedur ini bisa disisipkan dalam baris atas rutin loop seperti for.. do atau while.. do.

For i:= .. to .. do
Begin
  Application.ProcessMessage;
  .. {loop process}
  If .. then
  begin
    ... {request for stop looping process}
    Break;
  End;
End;

Namun penempatan rutin permintaan break (keluar dari proses looping) harus memperhatikan proses yang terjadi di baris rutin tersebut. Kita dapat meletakkannya diawal sebelum rutin memulaikan proses (perhitungan) atau diakhir setelah proses. Tidak disarankan meletakkan ditengah proses yang bisa membuat program menjadi error.

Contoh Penggunaan Prosedur ProcessMessages

Sebelumnya saya pernah membuat program sederhana mencari bilangan prima. Namun ketika program ini harus menghitung bilangan integer yang besar, bisa membuatnya tidak merespon interaksi luar ketika proses perhitungan loop berjalan.

Saya menggunakan variable pri untuk mendeteksi interaksi permintaan menghentikan proses dari tombol btnStop dan juga permintaan menutup program dari prosedur FormCloseQuery.

Berikut penyisipan prosedur ProcessMessages

var
  Form1: TForm1;
  stop, ExitProgram: boolean;
  pri: integer;
....

procedure TForm1.btnStartClick(Sender: TObject);
var
  h, i, k: integer;
begin
  stop:= false;
  btnStop.enabled:= true;
  btnStart.Enabled:= false;
  ProgressBar1.Position:= 0;
  pri:= 0;
  k:= StrtoInt(Edit1.Text);
  ProgressBar1.Max:= k;
  for h:=1 to k do
      begin
           Application.ProcessMessages;
           ProgressBar1.Position:= ProgressBar1.Position+1;
           if (k mod h) = 0 then
              pri:= pri + 1;
           if stop then
           begin
             pri:= 3;
             break;
           end;
           if ExitProgram then
           begin
             pri:= 4;
             break;
           end;
  end;

  case pri of
    1:
      begin
        ShowMessage(Edit1.Text + ' isnot a prime number.');
        btnStart.Enabled:= true;
        btnStop.Enabled:= false;
      end;
    2:
      begin
        ShowMessage(Edit1.Text + ' is a prime number.');
        btnStart.Enabled:= true;
        btnStop.Enabled:= false;
      end;
    3:
      begin
        ShowMessage('Proscess stopped at ' + inttostr(h));
        btnStart.Enabled:= true;
        btnStop.Enabled:= false;
      end;
    4: //Nothing to do here
  end;
end;

Sebuah tombol btnStop digunakan untuk meminta proses dihentikan melalui variabel boolean stop.

procedure TForm1.btnStopClick(Sender: TObject);
begin
  stop:= true;
  btnStart.Enabled:= true;
  btnStop.Enabled:= false;
end;

Kita juga akan mengalami kesulitan menutup program ketika proses looping masih berjalan, sehingga perlu ditambahkan permintaan untuk menghentikan proses tersebut menggunakan variable boolean ExitProgram.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  ExitProgram:= true;
  CanClose:= true;
end;

Contoh program yang menggunakan ProcessMessage bisa diunduh disini.