C# Kodlanan kronometrenin telefondaki kronometreden hızlı olması nasıl düzeltilir?

Tahhatass

Decapat
Katılım
29 Haziran 2021
Mesajlar
122
Daha fazla  
Cinsiyet
Erkek
C#:
public Form1()
        {
            InitializeComponent();
            timer1.Interval = 1;
        }
        double salise=0;
        int saniye=0;
        int dakika=0;
        int saat=0;
        int toplamSure = 0;
        double hesap = 0;
        bool basla = false;
        private void btnBaslat_Click(object sender, EventArgs e)
        {
            if (basla == false)
            {
                timer1.Start();
                basla = true;
                btnBaslat.Enabled = false;

                btnDurdur.Enabled = true;
                btnSifirla.Enabled = true;
            }
          
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            salise++;
            txtSalise.Text = salise.ToString();
            if (salise == 59)
            {
                salise = 0;
                saniye++;
              
                if (saniye == 59)
                {
                    saniye = 0;
                    dakika++;
                  

                    if (dakika == 59)
                    {
                        saat++;
                        dakika = 0;
                      
                    }
                }
            }
            txtSaniye.Text = saniye.ToString();
            txtDakika.Text = dakika.ToString();
            txtDakika.Text = dakika.ToString();
            toplamSure++;
        }
        public void durdur()
        {
            timer1.Stop();
            if (toplamSure > 0)
            {
                btnBaslat.Text = "Continue";
            }
            basla = false;
            btnBaslat.Enabled = true;
            btnDurdur.Enabled = false;
        }
        public void sifirla()
        {
            saniye = 0;
            salise = 0;
            dakika = 0;
            saat = 0;
            durdur();
            txtDakika.Text = dakika.ToString();
            txtSaat.Text = saat.ToString();
            txtSalise.Text = salise.ToString();
            txtSaniye.Text = saniye.ToString();
            btnBaslat.Text = "Start";
            toplamSure = 0;
            btnBaslat.Enabled = true;
            btnSifirla.Enabled = false;

            if (toplamSure > 0)
            {
                btnDurdur.Enabled = true;
            }
            else
            {
                btnDurdur.Enabled = false;
            }
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void btnSifirla_Click(object sender, EventArgs e)
        {
            sifirla();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            txtDakika.Text = dakika.ToString();
            txtSaat.Text = saat.ToString();
            txtSalise.Text = salise.ToString();
            txtSaniye.Text = saniye.ToString();
            btnDurdur.Enabled = false;
            btnSifirla.Enabled = false;
        }

        private void btnDurdur_Click(object sender, EventArgs e)
        {
            durdur();
          
        }


Arkadaşlar sorum şu. Yukarıdaki kod 1 salise olunca salise değişkenini 1 arttırıyor. Salise değişkeni 59 olunca sıfırlanıyor ve saniyeyi 1 arttırıyor. fakat telefonumdaki kronometre ile test ettiğim zaman ilerleyen saniyede benim yaptığım kronometre 43 saniye iken telefondaki kronometre 40 saniye falan oluyor. Benim uygulamamın neden öne geçtiğini anlamadım. İnternetten de araştırdım ve 1 saniyenin 60 salise olduğunu öğrendim. Yardım edin.
 
Bunu nasıl yapabilirz bilemedim açıkçası. Milisaniye ile salisayi tam hesaplamak pek mümkün değil gibi.
Neyse yardımınız için yine de teşekkür ederim. 2-3 saniye önde gitsin ne olacak :). Ama yine de bu konuyu araştıracağım.

Bunu nasıl yapabilirz bilemedim açıkçası. Milisaniye ile salisayi tam hesaplamak pek mümkün değil gibi.
Yine de teşekkür ederim. 2-3 saniye önde olsun ne olacak :). Ama bu konuyu yine de araştıracağım.
 
Salise ile milisaniye nasıl aynı olabilir salise bir saniyenin 60'da biri iken, milisaniye saniyenin 1000'de biri.
1000'i 60'a tam bölemediğin için onu simule etmen mümkün değil. 16 yaparsan az gelir, 17 yaparsan çok. Normal.
Dediğin normal şartlarda doğru fakat Windows gerçek zamanlı bir işletim sistemi değil ve çok küçük zamanlayıcı uğraşlarında sapıtabiliyor.

Aşağıda paylaştığım Stackoverflow konusunda bahsi geçen durum timer'ın belirlenenin üzerinde bir süre sonra çalışıyor olması. Bunun sebebi yukarıda dediğim gibi Windows gerçek zamanlı bir işletim sistemi değil ve next tick geldiğinde işlemi yapıyor. Dolayısıyla doğru sonuçlar vermiyor aşırı küçük intervallarda. Eğer çok uzun süreler koyarsan, yaptığı gecikme göze batmıyor. Atıyorum 5 saniyede bir arttırmak gibi vs vs şeyler göze batmıyor ancak her mikro saniyede bir saydırmaya çalışamıyor.

En altta paylaştığım microsoft dökümanlarını incelersek Windows'un her yaklaşık 15 ms'te bir tick yenilediğini görürüz. Bu da 1 interval verdiğimiz şeyin saniyede 1000 kere değil, 66-67~ kere çalışıyor olması demek. Fakat yazılımın yaptığı işlemlerle falan filan bu çalışma süresi 60'a kadar düşebiliyor.

Ben doğruya en yakın sonucu 60'da buldum. 16.6 ms civarı yapıyor. 15 ms tick + 1 ms interval + 0.5 ms işlem gecikmesi = 16.5 ms şeklinde hesapladım.

1701558707564.png

Çeviri; Örneğin Windows x86 bir işlemcide çalışıyor, varsayılan her bir sistem saat tiki aralığı tipik olarak yaklaşık 15 milisaniye, ve bu saat tiklerinin minimum aralığı yaklaşık 1 milisaniye.

Devamında da default timer resolution ile 15 ms'te bir kontrol edebiliriz, high timer resolution ile 1 ms'te bir.
 
Son düzenleme:
Dediğin normal şartlarda doğru fakat Windows gerçek zamanlı bir işletim sistemi değil ve çok küçük zamanlayıcı uğraşlarında sapıtabiliyor.

Aşağıda paylaştığım Stackoverflow konusunda bahsi geçen durum timer'ın belirlenenin üzerinde bir süre sonra çalışıyor olması. Bunun sebebi yukarıda dediğim gibi Windows gerçek zamanlı bir işletim sistemi değil ve next tick geldiğinde işlemi yapıyor. Dolayısıyla doğru sonuçlar vermiyor aşırı küçük intervallarda. Eğer çok uzun süreler koyarsan, yaptığı gecikme göze batmıyor. Atıyorum 5 saniyede bir arttırmak gibi vs vs şeyler göze batmıyor ancak her mikro saniyede bir saydırmaya çalışamıyor.

En altta paylaştığım microsoft dökümanlarını incelersek Windows'un her yaklaşık 15 ms'te bir tick yenilediğini görürüz. Bu da 1 interval verdiğimiz şeyin saniyede 1000 kere değil, 66-67~ kere çalışıyor olması demek. Fakat yazılımın yaptığı işlemlerle falan filan bu çalışma süresi 60'a kadar düşebiliyor.

Ben doğruya en yakın sonucu 60'da buldum. 16.6 ms civarı yapıyor. 15 ms tick + 1 ms interval + 0.5 ms işlem gecikmesi = 16.5 ms şeklinde hesapladım.

Eki Görüntüle 2039415
Çeviri; Örneğin Windows x86 bir işlemcide çalışıyor, varsayılan her bir sistem saat tiki aralığı tipik olarak yaklaşık 15 milisaniye, ve bu saat tiklerinin minimum aralığı yaklaşık 1 milisaniye.

Devamında da default timer resolution ile 15 ms'te bir kontrol edebiliriz, high timer resolution ile 1 ms'te bir.
Hmmm, anladım. Bu oldukça iyi bir bilgilendirme oldu. Yani arkadaşın yazdığı koddaki gecikmenin sadece 3 saniye fark etmesi de bu sebepten dolayı o zaman. Harikasın. Oldukça kafa karıştırıcı bir konuymuş, böyle bir problemle karşılaşırsam neyi araştıracağıma dair bir fikir edinmiş oldum sağ olasın.
 
Hmmm, anladım. Bu oldukça iyi bir bilgilendirme oldu. Yani arkadaşın yazdığı koddaki gecikmenin sadece 3 saniye fark etmesi de bu sebepten dolayı o zaman. Harikasın. Oldukça kafa karıştırıcı bir konuymuş, böyle bir problemle karşılaşırsam neyi araştıracağıma dair bir fikir edinmiş oldum sağ olasın.
Peki aradaki fark 3 saniye mi yoksa süre ilerledikçe aradaki fark artar mı? Eğer aradaki fark hep 3 saniye ise kronometre durdurulduğunda kronometreden 3 çıkarabilirim.
 
Oysaki bu kronometreyi ne umutlarla yapmıştım. :)

Şöyle yapsam. Mesela 4 saniye sonra aradaki fark 1 artıyor. Bende 4 saniyede bir 1 saniye düşürsem aradaki farkı minimuma indiremez miyi?.
Niye böyle uğraşıyorsun? Milisaniyelerle ölçmek yerine saniyeyle ölçsene? 1000 interval = 1 saniyede bir sayması demek. Çooooook daha uzun sürelerde sapma yapar.
 
Oysaki bu kronometreyi ne umutlarla yapmıştım. :)

Şöyle yapsam. Mesela 4 saniye sonra aradaki fark 1 artıyor. Bende 4 saniyede bir 1 saniye düşürsem aradaki farkı minimuma indiremez miyi?.
Neden salise? ms cinsinden koy oraya her şey çok daha iyi olur, kodunda çok bir düzenlemeye de gerek kalmaz. Ufak değişiklerle tamam. Ayrıca C# içinde StopWatch diye bir sınıf var. Onu başlatır sürekli geçen süreyi alırsan işin ayrı bir seviye de kolay olur ama bunu başta söylemedim çünkü burada amacın biraz kodla uğraşmak diye varsayıyorum.
 
Neden salise? ms cinsinden koy oraya her şey çok daha iyi olur, kodunda çok bir düzenlemeye de gerek kalmaz. Ufak değişiklerle tamam. Ayrıca C# içinde StopWatch diye bir sınıf var. Onu başlatır sürekli geçen süreyi alırsan işin ayrı bir seviye de kolay olur ama bunu başta söylemedim çünkü burada amacın biraz kodla uğraşmak diye varsayıyorum.
Evet kendimi geliştirmeye çalışıyorum. Desteğiniz için teşekkürler.
 

Yeni konular

Geri
Yukarı