Delay dalam pemrograman digunakan untuk menunda eksekusi baris program berikutnya. Perlu untuk Anda ketahui bahwa program dijalankan secara sekuensial dari atas (mulai klausa ‘Begin’) sampai dengan paling bawah (klausa ‘End’). Walaupun dalam pemrograman OOP dapat ‘melompat-lompat’ sesuai event yang terjadi (multithread), sesungguhnya tiap event handler akan mengeksekusi baris program didalamnya secara berurutan mulai dari ‘begin’ s/d ‘end’. Nah, fungsi delay ini adalah untuk menunda pengeksekusian baris program di bawahnya, atau bahkan untuk menghentikan proses program keseluruhan. Mari kita pelajari beberapa fungsi delay dalam Delphi dan karakteristiknya.
1. Delay unpredictable
Sesuai namanya, delay ini akan menghasilkan penundaan dengan waktu yang tergantung pada kecepatan clock prosessor masing-masing komputer. Delay ini sejatinya hanya melakukan perulangan di dalam perulangan supaya menghabiskan waktu sehingga efek delay bisa didapatkan. Delay ini tidak disarankan untuk digunakan karena selain waktu delay-nya tidak bisa diprediksi/berbeda tiap komputer, menghabiskan resource komputer dan tidak dapat diinterupsi . Contoh delay unpredictable :
Ambil komponen Button1 dan Edit di Form designer dan isikan baris program sbb :
procedure TForm1.Button1Click(Sender: TObject);
var i,a:integer;
begin
For i:=0 to 10000 do
For a:=0 to 50000 do ;
edit1.Text:=’delay selesai’;
end;
Pada contoh di atas, setelah tombol Button1 diklik, maka kotak edit1 akan berubah tulisannya menjadi ‘delay selesai’ setelah kira-kira 1 detik kemudian di laptop saya. Silahkan Anda coba di laptop masing-masing, saya yakin hasilnya akan berbeda-beda. Kalau ingin menghitung secara pasti sih sebenarnya bisa-bisa aja. Caranya begini, misalkan prosesor CPU laptop saya kecepatannya 2,5 GHz, berarti waktu ekseskusi 1 cycle-nya 1/2.5 Ghz = 0.4 ns (ingat rumus T=1/f dengan T=waktu periodik, f=frekuensi)> sekarang tinggal mencari perintah For… to…do dieksekusi selama berapa cycle? Jika sudah tahu tinggal dikalikan dengan variabel ‘i’ dan ‘a’ di atas. Mau menghitung? Saya sarankan tidak usah aja 🙂
2. Delay dengan Windows API
Delay berikutnya adalah menggunakan salah satu function dalam Windwos API. Function tersebut adalah ‘sleep’, dengan sintaks ‘Sleep (lama_delay)’ dengan parameter lama_delay dalam mili detik (ms). Jadi misalkan Anda ingin menunda suatu proses selama 1 detik, maka anda harus menuliskan ‘Sleep (1000);’. Delay dengan cara lebih bagus dari cara pertama, karena waktu delay diambil dari RTC (Real Time Clock) di motherboard sehingga waktunya lebih presisi. Namun, delay tipe ini juga tidak dapat diinterupsi, sehingga program seakan-akan berhenti menunggu proses pemanggilan fungsi ‘sleep’ ini selesai. Contoh :
Ambil 1 komponen Button dan komponen Edit ke dalam Form Designer, dan isikan baris program sbb:
procedure TForm1.Button1Click(Sender: TObject);
begin
sleep (1000);
edit1.Text:=’delay dengan sleep selesai’;
end;
Jika tombol Button1 ditekan, maka tulisan di kotak Edit1 akan berubah menjadi ‘delay dengan sleep selesai‘ setelah 1 detik kemudian. Silahkan dicoba, saya yakin di laptop Anda akan sama hasilnya (delay-nya sama-sama 1 detik).
3. Delay dengan komponen Timer
Tipe delay yang terakhir adalah menggunakan komponen Timer. Komponen ini memiliki event yang dipicu oleh waktu (OnTimer) yang dapat diatur intervalnya melalui properti ‘Interval’ dengan satuan milidetik. Jadi jika Anda mengeset properti ‘Interval’ dengan angka 1000, dan Anda meng-enable-kan timer tersebut, maka baris program di dalam ‘Begin’….’end’ timer akan dieksekusi tiap 1 detik sekali. Nah, bagaimana cara kita memanfaatkan karakteristik komponen Timer ini menjadi sebuah fungsi delay? Berikut adalah triknya :
Ambil komponen Button1, Edit1 dan Timer1 ke dalam Form Designer. Set properti ‘Enabled’ milik komponen Timer menjadi ‘false’ dan intervalnya dengan nilai 1000. Kemudian isikan baris program berikut di komponen Button1 :
procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=true;
end;
dan isikan baris program sebagai berikut di komponen Timer1 :
procedure TForm1.Timer1Timer(Sender: TObject);
begin
edit1.Text:=’delay dg timer’;
Timer1.Enabled:=false;
end;
jika Anda mengeksekusi program di atas (tekan F9), maka setelah tombol Button1 diklik tulisan kotak Edit1 akan berubah menjadi ‘delay dg timer’ setelah 1 detik kemudian. Jika Anda coba, saya yakin hasilnya akan sama. Jadi triknya adalah memanggil/memicu event OnTimer, namun langsung men-disable-nya (mengeset timer1.enabled menjadi bernilai ‘false’). Dengan demikian ‘efek’ delay akan didapat setiap memanggil OnTimer dengan cara mengeset method Timer1.enabled menjadi bernilai ‘true’ (timer1.Enabled:=true;). Keuntungan menggunakan cara ini adalah waktu interval delay yang presisi, dan program dapat diinterupsi oleh proses yang lain karena karakteristik dari komponen Timer yang sudah mendukung proses multithreading. Jadi jika Anda menggunakan delay dengan tipe ini maka program Anda akan berjalan seperti biasa dan tidak seakan-akan berhenti seperti saat pemanggilan fungsi delay pada cara 1 dan 2.
Demikian tutorial kali ini, semoga ada manfaatnya buat pembaca sekalian. Ohya, mana yang terbaik di Antara ketiga cara fungsi delay di atas? Saya piker disesuaikan dengan kebutuhan. Jika anda benar-benar ingin menghentikan semua proses maka sebaiknya menggunakan cara kedua, sedangkan jika ingin pemanggilan fingsi delay tidak mengganggu proses yang lain sebaiknya menggunakan cara yang ketiga.
a Technopreneur – writer – Enthusiastic about learning AI, IoT, Robotics, Raspberry Pi, Arduino, ESP8266, Delphi, Python, Javascript, PHP, etc. Founder of startup Indomaker.com
Makasih banyak! Ini adalah artikel yang saya cari-cari untuk membuat waktu penghitung mundur..
Terus berbagi!
terima kasih boss
saya udah lama ingin mencari cara delay di delphi
Untuk mengganti/custom nilai sleep (dalam contoh, sleep (1000)) angka 1000 nya di buat form yg bisa dinganti ganti oleh user gimana caranya ya mas?
tinggal bikin form baru, tambahkan komponen edit atau spinedit sama button. Trus diisi event handlernya di event onClick milik komponen Button
nsleep:=strtoint (edit1.text);
kemudian di sisi script sleep-nya diganti ‘sleep (nsleep);’
Keterangan nya incompatible types mas … Bisa di contohkan detail nya mas…
Trims
bagian mana yg incompatible type mas?
numpang nanya mas
saya mau tanya mas, soalnya dah bingung lagi
mau buat tempat penyimpanan ke database secara pemenit lewat button
tapi bingung mau buat nya mas
tolong bantuannya mas biar penyimpanan ke data base bisa diatur permenit lewat even secara massal
trimakasih mas
bikin timer aja mas, set intervalnya 60000 (60 detik = 1 menit).
Kemudian isi event handler-nya (di onTimer) dengan function save database.