C# Timer da Sorun

Başlatan Jarvis, 27 Şubat 2016, 13:39:15

Jarvis

Timer içinde 800ms de bir Analog veri okuyorum şu şekilde ve labela yazıyorum

string sonuc = serialPort1.ReadExisting();
lbl_deneme.Text = sonuc + "";


Gene aynı şekilde timer içinde bu okuduğum analog değer 1 ise Komporesör devreye girdi diyorum ve listboxa saati ile birlikte yazdırıyorum.


if (Convert.ToUInt32(lbl_deneme.Text) >= 1)
                {
                    lbl_kompresordurum.Text = "Kompresor Devreye Girdi";
                    label1.Text = "Bağlantı Gerçekleştirildi";

                    listBox2.Items.Add(lbl_saatdeneme2.Text + "  " + lbl_kompresordurum.Text); 

                }
                if (Convert.ToUInt32(lbl_deneme.Text) == 00000000)
                {
                    lbl_kompresordurum.Text = "Kompresor Devreden Çıktı";
                    label1.Text = "Bağlantı Gerçekleştirildi";
              
                    listBox2.Items.Add(lbl_saatdeneme2.Text + "  " + lbl_kompresordurum.Text);
                }


Problem şu timer her 800ms de bir tick verdiği için programı başlatınca

13:38:20 Kompresör Devreye Girdi
13:38:21 Kompresör Devreye Girdi
13:38:22 Kompresör Devreye Girdi
13:38:23 Kompresör Devreye Girdi
13:38:24 Kompresör Devreye Çıktı
13:38:25 Kompresör Devreye Çıktı
13:38:26 Kompresör Devreye Çıktı


Doğal olarak bütün saniye ne yapıldığı yazıyor.

Bunun çıktısını şu şekilde getirmeye çalışıyorum

13:38:20 Kompresör Devreye Girdi
13:38:24 Kompresör Devreye Çıktı

Yani aynı şeyleri sürekli tekrarlamasın.

Tekrar yaptığı zaman listboxa yazma gibi bir if döngüsü atmam lazım.


tunayk

Bu durumda durum bilgisini tutan bir değişken kullanacaksın. Timer kesmelerinde de değişkenin halihazırda ki değeri ile labelin gösterdiği arasında fark var mı diye bakacaksınız.  Eğer fark varsa labeli güncelleyin yoksa bişey yapmayın.

makdeniz

#2
byte kompaktif = 0;  diye bir değişken tanımlayın ve değerini "0" yapın.



if (Convert.ToUInt32(lbl_deneme.Text) >= 1)
            {
               
                if (kompaktif == 0)
                {
                lbl_kompresordurum.Text = "Kompresor Devreye Girdi";
                label1.Text = "Bağlantı Gerçekleştirildi";

                listBox2.Items.Add(lbl_saatdeneme2.Text + "  " + lbl_kompresordurum.Text);
                    kompaktif = 1;
                }
            }
            if (Convert.ToUInt32(lbl_deneme.Text) == 00000000)
            {
                if (kompaktif == 1)
                {
                lbl_kompresordurum.Text = "Kompresor Devreden Çıktı";
                label1.Text = "Bağlantı Gerçekleştirildi";

                listBox2.Items.Add(lbl_saatdeneme2.Text + "  " + lbl_kompresordurum.Text);
                    kompaktif = 0;
                }
            }
Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.

Jarvis

Alıntı yapılan: makdeniz - 27 Şubat 2016, 23:02:37
byte kompaktif = 0;  diye bir değişken tanımlayın ve değerini "0" yapın.



if (Convert.ToUInt32(lbl_deneme.Text) >= 1)
            {
               
                if (kompaktif == 0)
                {
                lbl_kompresordurum.Text = "Kompresor Devreye Girdi";
                label1.Text = "Bağlantı Gerçekleştirildi";

                listBox2.Items.Add(lbl_saatdeneme2.Text + "  " + lbl_kompresordurum.Text);
                    kompaktif = 1;
                }
            }
            if (Convert.ToUInt32(lbl_deneme.Text) == 00000000)
            {
                if (kompaktif == 1)
                {
                lbl_kompresordurum.Text = "Kompresor Devreden Çıktı";
                label1.Text = "Bağlantı Gerçekleştirildi";

                listBox2.Items.Add(lbl_saatdeneme2.Text + "  " + lbl_kompresordurum.Text);
                    kompaktif = 0;
                }
            }


Mantıklı bir yaklaşım denedim oldu.

Şöyle bir çözüm yolunu da çalıştırdım listBox1.Items[j] ile listbox1.Items[j-1] aynı ise yazdırmıyorum. Fakat sizin öneriniz daha kullanışlı ve basit.