none
timer gecikme sorunu RRS feed

  • Soru

  • arkadaşlar uygulamam da timer interval değerini 1ms ayarlıyorum ve başlatıyorum.Ancak Timer işlemi 5 sn de olması gereken işlemi 8 sn de yerine getiriyor.(step değeri 5000 bu arada). çok sık girdiği için mi bir sorun oluyor acaba ? 
     sayac_z++;
                if (timerz_bayrak == false)
                {
                    place_z++;
                    label10.Text = place_z.ToString();
                }
                else if (timerz_bayrak == true)
                {
                    place_z--;
                    label10.Text = place_z.ToString();
                }
                if (sayac_z == step)
                {
                    sayac_z = 0;
                    timer3.Stop();
                }

    17 Ağustos 2013 Cumartesi 16:19

Yanıtlar

  • Windows Forms Timer form ile aynı thread de çalışır. Aynı anda 1 işlem yapabilir. Böyle olunca sizin threadiniz meşgul ise bir sonraki timer dönüşü işlem kuyruğunda beklemeye mahkumdur. Ve bu sebeple forms timer (soldan sürükleyip bıraktığınız) genellikle çalışması gereken aralığa göre bir kaç ms farklılık göstererek çalışır. Keza thread dolu ise hiç çalışmayabilir de.

    Thread.Timer kullanırsanız her döngü kendi threadini açacaktır. Böylece 2ms interval için işleminiz 4ms sürüyorsa aynı anda 2 tane tick metodu çalışacaktır. Tabi thread timer gibi farklı threadlerde işlem yapan metotlar kullandığınızda label10.text (hiç bir zaman label1, textbox1 gibi isimsiz işlere kalkışmamanızı tavsiye ederim) gibi bir kullanım cross thread konusuna girecektir. Ufak bir invoke kullanmanız gerekir.

    23 Ağustos 2013 Cuma 06:39
  • Timerın içinde ne yapmaya çalışıyorsun tam açıklarmısın niye 1ms niye 2ms değil?

    timer1.Interval=1;

    yaparsan olur yukarıda paylaştığım kod parcası yine sorunsuz çalışır.

    farkılı çözümler deniyebilirsin;

     while (true) { //sonsuz döngü
          System.Threading.Thread.Sleep(1); // 1ms
       

          if(islemi bitir){

            Break;//döngüden çık

         }
     }

    Yada timerı threadle kullanıp farklı kanalda çalıştırabilirsin.


    her timer a girdiğinde label değeri değişiyor. Threadle kullanmayı deneyeceğim bakalım

    Farklı thread tam o zaman da çalışabilir ama bu label'ın tam o anda değişeceği anlamına gelmez  (ki zaten tam o anda olsun demeniz işletim sistemi için geçerli değil ):) Ama bir önceki yöntemden daha başarılı sonuçlar elde edersiniz. Zaten 1ms fark olsa kim nasıl görecek onu :D

    http://www2.cs.uregina.ca/~hamilton/courses/330/notes/scheduling/scheduling.html

    http://recoverymonkey.org/2007/08/17/processor-scheduling-and-quanta-in-windows-and-a-bit-about-unixlinux/

    23 Ağustos 2013 Cuma 12:08

Tüm Yanıtlar

  • Merhaba,

    Bu kod nerede çalışıyor tam kod paylaşırmısınız debug edip adım adım kontrol ettiğinizde ne görünüyor.

    İyi Çalışmalar

    17 Ağustos 2013 Cumartesi 16:29
  • tam kodu biraz uzun ama örnek olarak kısa bir kod yazmıştım hatayı anlamak için,

    namespace timer
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            int x = 500;
            private void button1_Click(object sender, EventArgs e)
            {
                timer1.Start();
            }
    
            int y = 0;
            private void timer1_Tick(object sender, EventArgs e)
            {
                y++;
                if (y == x)
                {
                    label1.Text = "bitti";
                    timer1.Stop();
                    y = 0;
                }
            }
        }

     Yukarıdaki kodda da aynı mantık var 10 ms olarak ayarlanmış timer ve 5 sn de işlemin bitmesi gerekiyor ama 8 sn sürüyor

    17 Ağustos 2013 Cumartesi 19:33
  • arkadaşlar yardımcı olabilecek yok mu ? 
    22 Ağustos 2013 Perşembe 18:23
  • timerin içindeki kod bloğu timerı geciktirebilir.

    namespace timer { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { timer1.Interval = 5000; timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) {

      if (timer1.Interval==5000)
                {
                    timer1.Stop();
                    MessageBox.Show("Bitti");
                }

    } }


    şeklinde denermisin gecikme olmassa timerin içindeki kod bloğu yavaşlatıyodur.




    • Düzenleyen eakin 22 Ağustos 2013 Perşembe 19:33
    22 Ağustos 2013 Perşembe 19:20
  • timerin içindeki kod bloğu timerı geciktirebilir.

    namespace timer { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { timer1.Interval = 5000; timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) {

      if (timer1.Interval==5000)
                {
                    timer1.Stop();
                    MessageBox.Show("Bitti");
                }

    } }


    şeklinde denermisin gecikme olmassa timerin içindeki kod bloğu yavaşlatıyodur.




    muhtemelen ondan oluyor . Yazdığınız şekilde doğru çalışır ama benim işime bu şekilde yaramaz. Timera 1ms girmesi lazım
    22 Ağustos 2013 Perşembe 19:55
  • Timerın içinde ne yapmaya çalışıyorsun tam açıklarmısın niye 1ms niye 2ms değil?

    timer1.Interval=1;

    yaparsan olur yukarıda paylaştığım kod parcası yine sorunsuz çalışır.

    farkılı çözümler deniyebilirsin;

     while (true) { //sonsuz döngü
          System.Threading.Thread.Sleep(1); // 1ms
       

          if(islemi bitir){

            Break;//döngüden çık

         }
     }

    Yada timerı threadle kullanıp farklı kanalda çalıştırabilirsin.


    • Düzenleyen eakin 23 Ağustos 2013 Cuma 05:54
    23 Ağustos 2013 Cuma 05:53
  • Windows Forms Timer form ile aynı thread de çalışır. Aynı anda 1 işlem yapabilir. Böyle olunca sizin threadiniz meşgul ise bir sonraki timer dönüşü işlem kuyruğunda beklemeye mahkumdur. Ve bu sebeple forms timer (soldan sürükleyip bıraktığınız) genellikle çalışması gereken aralığa göre bir kaç ms farklılık göstererek çalışır. Keza thread dolu ise hiç çalışmayabilir de.

    Thread.Timer kullanırsanız her döngü kendi threadini açacaktır. Böylece 2ms interval için işleminiz 4ms sürüyorsa aynı anda 2 tane tick metodu çalışacaktır. Tabi thread timer gibi farklı threadlerde işlem yapan metotlar kullandığınızda label10.text (hiç bir zaman label1, textbox1 gibi isimsiz işlere kalkışmamanızı tavsiye ederim) gibi bir kullanım cross thread konusuna girecektir. Ufak bir invoke kullanmanız gerekir.

    23 Ağustos 2013 Cuma 06:39
  • Timerın içinde ne yapmaya çalışıyorsun tam açıklarmısın niye 1ms niye 2ms değil?

    timer1.Interval=1;

    yaparsan olur yukarıda paylaştığım kod parcası yine sorunsuz çalışır.

    farkılı çözümler deniyebilirsin;

     while (true) { //sonsuz döngü
          System.Threading.Thread.Sleep(1); // 1ms
       

          if(islemi bitir){

            Break;//döngüden çık

         }
     }

    Yada timerı threadle kullanıp farklı kanalda çalıştırabilirsin.


    her timer a girdiğinde label değeri değişiyor. Threadle kullanmayı deneyeceğim bakalım
    23 Ağustos 2013 Cuma 09:22
  • Timerın içinde ne yapmaya çalışıyorsun tam açıklarmısın niye 1ms niye 2ms değil?

    timer1.Interval=1;

    yaparsan olur yukarıda paylaştığım kod parcası yine sorunsuz çalışır.

    farkılı çözümler deniyebilirsin;

     while (true) { //sonsuz döngü
          System.Threading.Thread.Sleep(1); // 1ms
       

          if(islemi bitir){

            Break;//döngüden çık

         }
     }

    Yada timerı threadle kullanıp farklı kanalda çalıştırabilirsin.


    her timer a girdiğinde label değeri değişiyor. Threadle kullanmayı deneyeceğim bakalım

    Farklı thread tam o zaman da çalışabilir ama bu label'ın tam o anda değişeceği anlamına gelmez  (ki zaten tam o anda olsun demeniz işletim sistemi için geçerli değil ):) Ama bir önceki yöntemden daha başarılı sonuçlar elde edersiniz. Zaten 1ms fark olsa kim nasıl görecek onu :D

    http://www2.cs.uregina.ca/~hamilton/courses/330/notes/scheduling/scheduling.html

    http://recoverymonkey.org/2007/08/17/processor-scheduling-and-quanta-in-windows-and-a-bit-about-unixlinux/

    23 Ağustos 2013 Cuma 12:08
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace timer { public partial class Form1 : Form { static int y=0; static int x = 500; static System.Threading.Timer sayac; delegate void ınv(); public Form1() { InitializeComponent(); System.Threading.TimerCallback kontr = new System.Threading.TimerCallback(process_timer); } private void button1_Click(object sender, EventArgs e) { sayac = new System.Threading.Timer(process_timer,0,0,1); } //public int y=0; static void process_timer(object obj) { y++; if (y == x) { y =0; sayac.Dispose(); ınv goster = new ınv(bas); goster.Invoke(); } } static void bas() { label1.Text = "bitti"; } } }

    dediğinizi yapmaya çalıştım ancak şöyle bir hata alıyorum

    Error 1 An object reference is required for the non-static field, method, or property 'timer.Form1.label1'
    23 Ağustos 2013 Cuma 12:43
  • bir önceki yöntemden kasıt nedir hocam tam olarak ? 
    23 Ağustos 2013 Cuma 22:04