Tam Sürümünü Görmek İçin : C++ taki Delay() komutu..
phjunior
26/06/2005, 17:10
Selam arkadaşlar. Böyle basit bi soru için kimseyi rahatsız etmek istemezdim ama artık karnıma ağrılar girdi başka seçeneğim kalmadı.
3-4 sene kadar önce 3 sene boyunca Cobol ve C++ da yazılım geliştirdim. Nitekim bazı sebeplerden dolayı programcılığa ara vermek zorunda kaldım. Şimdi o eski günler aklıma geldi ve yeniden başlama kararı aldım. Gerçi yazılım sektörü baya bi ilerledi nası yetişirim bilmiyom ama neyse. C# ile tekrar başladım. Şu anda kendimce bişeyler karalamaktayım ki öğreneyim. Ama malesef bir yerde takılıp kaldım MSDN kütüphanesini hatim etmeme, arama motorlarında her türlü kombinasyonu deneyip aramaya çalışmama rağmen sorunumu istediğim gibi gideremedim.
Biliyorum absurt bi soru olucak ama C++ da Delay(int,) diye bi komut vardı bu komutun benzeri C# da yokmudur? İllaki Timer mı kullanmam lazım?
Kısadan şöyle söyliyeyim bir döngüyü yavaşlatmak istemekteyim ne yaparım C# da C++ da olsaydım kıralını yapardım ama C# da bi türlü bulamadım Help Pls?
Kusura bakmayın eskimişim napim :) yardım ederseniz sevinirim. Şimdiden teşekkürler.
acehreli
26/06/2005, 20:46
Windows ve C# ile ilgili olarak MSDN cok iyi bir kaynaktir. Aramaya Delay degil de, Sleep ile baslayabilirsin :)
Win32:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp
.NET:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemThreadingThreadClassSleepTopic.asp
Bu arada, aslinda C++'ta oyle bir islev yok; anlasilan kullandigin zaman bir kutuphaneden yararlaniyormussun.
Ali
phjunior
26/06/2005, 20:56
@acehreli
Dostum çok saolasın. sleep komutuyla biraz uğraşmıştım. Ama bi türlü istediğim gibi yapamadım nedense :garip: dedim sanırım olay bu değil başka bi komutla halledicez. Bu arada Borland Turbo C++ ver 3.0 da dos.h kütüphanesinde vardı delay komutu ;) komutu asla unutmam çünkü ilk ses efektini verirken hocam göstermişti :) hey gidi günler. Ben şu sleep komutuna tekrar bakem. Tekrar tekrar teşekkür. (Nası yetişecem ben bu C# a ama hadi bakalım).
Donguyu ayri bir thread olarak calistirip, thread.sleep kullanabilirsin.
kolay gelsin...
karamemed
26/06/2005, 23:45
System.Threading.Thread.Sleep(1000);//1000 ms yani 1 sn uyur program. Daha doğrusu askıya alınır. Parametre ms cinsindendir.
Kolay gelsin..
phjunior
27/06/2005, 01:33
Arkadaşlar yardımlarınız için çok teşekkürler. Sleep komutunu incelemiş ve denemiştim. Ama istediğim sonucu alamamıştım. (Deterjan reklamı gibi oldu :p)
Şimdi kısadan olayı anlatayım. Programcığımız Windows ortamında Visual Studio DE 2003 kullanılarak C# ile yazılmakta. Programın olayı şudur. Ekrana gelen form görüntüsüne bir label ekleyip bu labelde 10 dan geriye doğru saydırılmaktadır. Yani "x sn sonra kapancak" gibi bir uyarı gelmekte. Tabe bunun için bir döngümüz mevcut. Aynen iletiyorum.
for (int x=10;x>=0;x--)
{
label1.Text = x.ToString()+" sn. sonra kapanacak.";
}
Tabi bu şekilde bırakınca 10 dan 0 a doğru geri geri sayması bir bilgisayarı fazla zorlamayacağından biz direk Şıırak diye "0 sn. sonra falan olacak" mesajını almaktayız. Bu olayı yavaşlatmak içinde C++ da "delay(bir rakam);" şeklinde komut vardı ve direk döngünün arasına örneğin "delay(100);" yazmamız yetmekte idi.
Sleep komutunu inceledim ve şu şekilde yazdım.
for (int x=10;x>=0;x--)
{
label1.Text = x.ToString()+" sn. sonra kapanacak.";
Thread.Sleep(1000);
}
"10 sn. sonra kapanacak", "9 sn. sonra kapanacak", "8 sn. sonra kapanacak"........ "0 sn. sonra kapanacak" şeklinde 1 er saniye ara ile bekleyerek ve göstererek ekrana yazdırmasını beklemiştim. Ama velhasıl-kelam gelgelim bilakis 10sn boyunca bekleyip direk olarak "0 sn. sonra kapanacak" şeklinde mesajı üzülerek almaktayım.
Sabah 11 den beri allah cezamı vermesin koskoca makinaya 10 dan geri geri saymasını öretemedim :p Şu anda saat 01:17 itibari ile kafayı yemiş bulunmaktayım. Ve malesef uzun bir aradan sonra programcılığa (ki 3-4 sene var bu) C# ile tekrardan bi uğramak istemiş dakka 1, gol 1 durumu söz konusu olmuş ve migrenim azmıştır.
Lütfen 10dan geriye doğru sayan Windows ortamında C# kullanarak yazılmış bir ufak komutcuk(lar) ihsan edebilirseniz şu sevgili nacizane cücük beynime o güçlü ve kaslı parmaklarınıza Allah zeval vermesin efenim diyerek dua edeceğim.
acehreli
27/06/2005, 06:06
Ben gorsel programlamadan hic anlamam ama acaba label1.Text'i degistirmenin yaninda o formun tekrar cizilmesini mi saglamak gerekiyor?
Ali
karamemed
27/06/2005, 09:36
Mesele Sleep yapmakta. Yani program askıya alındığı için boyama işlerini yapamıyor sanırım. Dikkat edersen döngü boyunca formu da yerinden oynatamazsın. Hatta Windows program yanıt vermiyor dahi diyebilir. Çünkü program askıya alındığı için boyama gibi windowsa düşen görevler de yerine getirilemiyor. Windows senin programın için hiç bişi yapamıyor 10 sn boyunca. Bu durum diğer diller için de geçerlidir büyük ihtimalle.
Sonuç olarak timer kullanmalısın. Çünkü timer kullandığın zaman programın askıya alınmaz. Belli periyotlarla(örneğin 1 saniye) istediğin kod kesimi işletilir. Bu olay tabanlı programlamanın en güzel yanlarındandır. Burada olay sistem tarafından istediğin periyotlarla üretilir.
Forma bir timer koy.(Araç kutusunda saat resmi olan şey). Sonra interval özelliğini 1000 yap. Bu 1 sn'de bir sistemin olay üretme periyodudur. Sonra koyduğumuz timer'ın üzerine çift tıkla timer1_tick(..) diye bir fonksiyon oluşturulup bu size gösterilecektir. Şimdi oraya label1.Text = x.ToString()+" sn. sonra kapanacak."; yazabilirsin. Bu kod kesimi 1 sn'de bir işletilecek. Tabi x değişkenini de formun bir özelliği olarak tanımlayacaksın. private int x = 10; şeklinde mesela.
Peki timer ne zaman başlayacak veya duracak? Bunu senin belirlemen gerekiyor. Örneğin bir butonun tıklanma olayına(clicked) veya form'un yüklenme olayına(load) koyabilirsin başlatma işlemini. timer1.start(); bu kadar basit. Durdurma işini ise timer'ın tick olayı içine yazabiliriz.
private void timer1_Tick(object sender, System.EventArgs e)
{
label1.Text = x.ToString()+" sn. sonra kapanacak."; //bunu yazmıştık zaten
x--;//pardon bu da gerekli :)
if(x == 0){
timer.Stop();
}
}
Burada Stop işleminden sonra yapma gerekenler varsa yine buradaki if'in içine koyabilirsin. Örneğin formu kapatacaksındır büyük ihtimalle. this.Dispose(); formu kapatır.
Kolay gelsin..
phjunior
27/06/2005, 11:31
Karaaamemeediiimm vuurr kadehlereee adii içeeliiim içeeliim heergeceee......
Ooollduu beaaa olduuu. Çook saol memed adaş :D ve yardım eder herkeze binlercee teşekkürler. OOhh çatlıyodum valla. dos zamanında C++ da muhasebe programları yazardık şimdi 10 dan geriyo doğru saydıramıyoz :hiohahoha .ok teşekkür ettim herkeze yardım ları için veri veri tenkyu. mucx all
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.