For i döngüsünde, başka butona müdahale problemi!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

For i döngüsünde, başka butona müdahale problemi!

Mesaj gönderen sertkayasalih »

Herkese Merhaba,

- Yapmak istediğim, farklı zaman aralıklarında Tik ve Tak seslerini çalarak (Tik, Tak, Tik, Tak) olacak şekilde metronom hazırlamak.
İnternette örnek projeler buldumsa da onlarda da problem var!

- Taslak çalışması için:
AnaForm üzerinde 2 adet ses seviye kontrolü için slider, 1 tane hız değeri giriş için Edit kutucuğu ve 1 tanede başla ve dur işlemi için button var.

Örnek bulduğum kodları aşağıdaki gibi yapmaya çalıştım.

Kod: Tümünü seç

...
procedure AnaForm.SesleriSiraliCal(hiz:integer);
var
 x:byte;
begin
   for x:=1 to 2 do
    begin
      if tag = 1 then exit;
      begin
        if x mod 1=0 then TikCal;  //Tik wav dosyasını çalan procedure
        if x mod 2=0 then TakCal;  //Tak wav dosyasını çalan procedure
        sleep(hiz);
      end;
    end;
end;


procedure AnaForm.btnBaslaDurClick(Sender: TObject);
begin
  if btnBaslaDur.caption='Basla' then
  begin
    tag := 0 ;
    btnBaslaDur.caption:='Dur';
    while tag=0 do  
      begin
        SesleriSiraliCal(StrToInt(Edit1.Text));
      end;
  end 
   else
  begin
    btnBaslaDur.caption:='Basla'; 
    tag:=1;
  end;
end;

- Yukardaki kodlar sesleri istenilen hız aralığı ile Basla butonuna basıldığında sorunsuz olarak tekrar Dur butonuna basıncaya kadar çalıyor.

- Problem:
Çalma işlemi devam ederken,
1- AnaFormun Caption bölümüne mouse ile dokunulduğu zaman,
2- Ses seviyesi kontrolü için sileder ın pozisyonu değişirken çalma işlemi beklemeye geçiyor!
AnaForm Caption u ve sileder serbest bırakıldığında tekrar kaldığı yerden çalmaya başlıyor!

- Yukarda belirttiğim bu problemi nasıl çözebilirim?

Yardımcı olan herkese şimdiden teşekkürler :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Sleep yerine timer kullanırsan saırım böyle bir problemin kalmaz.
Bi de döngülere application.processmessages koyarsan daha güzel olur.


Kolay Gelsin...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
midijor yazdı:- Yukardaki kodlar sesleri istenilen hız aralığı ile Basla butonuna basıldığında sorunsuz olarak tekrar Dur butonuna basıncaya kadar çalıyor.
ama döngüye baktığımda
midijor yazdı: for x:=1 to 2 do
begin
if tag = 1 then exit;
begin
if x mod 1=0 then TikCal; //Tik wav dosyasını çalan procedure
if x mod 2=0 then TakCal; //Tak wav dosyasını çalan procedure
sleep(hiz);
end;
end;
for 1 to 2 denmiş.
yani bir tik bir tak tamam.
yoksa bilmediğim bir şey mi var?
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

döngü kullanmadan çalma işlemini timer da yapsan nasıl olur.
hatta bide Application.ProcessMessages; koyarsan donmalar ortadan kalkar sanırım.
Resim

..::|YeşilMavi|::..
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Tekrar Merhaba,

- Yanıtlarınız için hepinize çok teşekkür ederim :)
hdayi yazdı:Sleep yerine timer kullanırsan sanırım böyle bir problemin kalmaz.
- Hocam Delphinin bu konularında yeni olduğumdan tam olarak anlayamadım!
Aynı döngünün içinde Sleep komutunun yerine mi timer kullanmayı tavsiye ettiniz?
aslangeri yazdı:for 1 to 2 denmiş.
yani bir tik bir tak tamam.
yoksa bilmediğim bir şey mi var?
- Hocam formun üzerine dokunulmadığı sürece bir sorun yok!
Amacım aynı döngüyü kullanıp sorunsuz çalışabilir duruma gelirse, veya stabil çalışabilen başka bir yol bulabilirsem StepPlay veya PatternPlay denilen sisteme doğru genişletmeyi düşünüyorum!
- İnternette bulduğum örnek çalışmalarda da aynı donukluk var!

Örnek: 4 adımlık eşit zamanlı bir yürüyüş düşünelim. 1. adımında Tik çalsın, 2. adımda Tak çalsın gibi...
lazio yazdı:döngü kullanmadan çalma işlemini timer da yapsan nasıl olur.
hatta bide Application.ProcessMessages; koyarsan donmalar ortadan kalkar sanırım.
@lazio hocam,

- Önerileriniz için çok teşekkür ederim!

...................................

- Önerilerinizi uyguladıktan sonra neticeyi tekrar buraya bildiririm.

Tekrar yardımcı olan herkese çok teşekkür ederim :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Timer bir sistem tabında bulunan bir nesne. Interval diye bir özelliği var, milisaniye cinsinden bir değer veriyorsun misal: 3*60*1000=180000 3 dakikada bir onTimer'a yazdığın kodu çalıştırır. bu dögüyü sleep olmadan ontimer olayına yazarsan kendisi bunu otomatik olarak yapar.

Program bir komut dizsini yürütmeye başlayınca, bu dizi bitene kadar mouse ve klavye çalışmaz. Eğer bir döngü varsa hele bu döngü de uzun sa o zaman kilitlenmiş gibi olur makina. Ama Application.ProcessMessages dersen, bu komuta her geldiğinde, klavye ve mouse'tan gelen mesajları da yütür(diğerlerini de tabii).

Kolay gelsin...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba @hdayi hocam,

- Açıklamalı mesajınızdan sonra gerekli değişikliği yaptım. Tek ses için mükemmel çalışıyor. 2. ses içinse herhalde 2. timer kullanmam gerekecek!

Tekrar yardımlarınız için çok teşekkür ederim :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

aynı timer içinde kullanabilirsin, mesela
global bir boolean değişken tanımla (bTikTak : Boolean)

timer da;

Kod: Tümünü seç

....
if bTikTak then
  cal(tik)
else
  cal(tak);
bTikTak := not bTikTak;
....
Resim

..::|YeşilMavi|::..
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba lazio hocam,
lazio yazdı:aynı timer içinde kullanabilirsin, mesela
global bir boolean değişken tanımla (bTikTak : Boolean)

timer da;

Kod: Tümünü seç

....
if bTikTak then
  cal(tik)
else
  cal(tak);
bTikTak := not bTikTak;
....
- Önerinizi aynı şekilde uyguladım sonuç mükemmel :)

Tekrar yardımcı olan herkese çok teşekkür ederim :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Cevapla