C# Sonsuz döngüyü kıramıyorum..

flowchartx

Aktif Üye
Katılım
18 Ağustos 2021
Mesajlar
217
C#:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
   if (checkBox1.Checked == true)
   {
      while (checkBox1.Checked == true)
      {
         string[] dizi = { "1", "2", "3", "4", "5", "6" };

         for (int i = 0; i < 3; i++)
         {
            serialPort1.Write(dizi[2 * i]);
            serialPort1.Write(dizi[2 * i + 1]);
            System.Threading.Thread.Sleep(300);
            serialPort1.Write("0");
         }
         if (checkBox1.Checked == false)
            break;

      }
   }
}

Merhabalar
C# ile yeni çalışmaya başladım. Yukardaki kodda chexboxı enable yapınca sürekli seri porta veri göndermek istiyorum ve disable yapınca döngüden çıkmasını istiyorum. Fakat programı çalıştırdığımda chexboxu enable yaptığım anda arayüz kilitleniyor arayüzde hiç bir işlemm yapamıyorum, while döngüsü içinden çıkamıyorum nasıl bir yol izlemeliyim yardımcı olursanız çok sevinirim
 
Bir mesaja program kodu ekleyeceğin zaman, editör menüsünden "Kod" seçeneğini seçerek ekle. Daha anlaşılır olur.

1634062542234.png


Seri porta yazmada takılıyor olabilir. Mesela seri portta akış kontrolü (flow control) aktifleştirilmiş ise ve kontrol sinyalleri de portun meşgul olduğunu gösteriyorsa o yazme bekler durur.
 
Ben bir mantık hatası göremedim. Olması gerekir gibi sanki. Olmadı birde şöyle deneyebilirisin;
C#:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
   if (checkBox1.Checked == true)
   {
      gonder();
   }
    return;
}

void gonder()
{

         string[] dizi = { "1", "2", "3", "4", "5", "6" };

         for (int i = 0; i < 3; i++)
         {
            serialPort1.Write(dizi[2 * i]);
            serialPort1.Write(dizi[2 * i + 1]);
            System.Threading.Thread.Sleep(300);
            serialPort1.Write("0");
         }
         if (checkBox1.Checked == true)  gonder(); // yineleme
        
    return;
}

Bu arada c# dan anlamam :cheeky2:
 
Ben bir mantık hatası göremedim. Olması gerekir gibi sanki. Olmadı birde şöyle deneyebilirisin;
C#:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
   if (checkBox1.Checked == true)
   {
      gonder();
   }
    return;
}

void gonder()
{

         string[] dizi = { "1", "2", "3", "4", "5", "6" };

         for (int i = 0; i < 3; i++)
         {
            serialPort1.Write(dizi[2 * i]);
            serialPort1.Write(dizi[2 * i + 1]);
            System.Threading.Thread.Sleep(300);
            serialPort1.Write("0");
         }
         if (checkBox1.Checked == true)  gonder(); // yineleme
      
    return;
}

Bu arada c# dan anlamam :cheeky2:

gonder fonksiyonu kendi kendini çağırıyor burada. Kısa süre sonra program stack overflow ile sonlanır. Kendi kendini çağırma, derinlik sınırlı ise mantıklı. Burada derinliğin bir sınırı yok, adam checkbox'u bir hafta sonra da işaretleyebilir :)
 
gonder fonksiyonu kendi kendini çağırıyor burada. Kısa süre sonra program stack overflow ile sonlanır. Kendi kendini çağırma, derinlik sınırlı ise mantıklı. Burada derinliğin bir sınırı yok, adam checkbox'u bir hafta sonra da işaretleyebilir :)
En azından event döngüsünde mi bir sorun var onu anlarız.
 
C#:
      while (checkBox1.Checked == true)
      {
         string[] dizi = { "1", "2", "3", "4", "5", "6" };
Her döngüde dizi stringi yeniden tanımlanıyor, bu nasıl bir sonuç doğurur? Bakmak lazım. Bunun yerine ;
C#:
  string[] dizi = { "1", "2", "3", "4", "5", "6" };     

while (checkBox1.Checked == true)
      {       
         for (int i = 0; i < 3; i++)
         {
daha doğru olur.
 
Fonksiyon:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
   string[] dizi = { "1", "2", "3", "4", "5", "6" };
   if (checkBox1.Checked == true)
   {
      while (checkBox1.Checked == true)
      {
       
         for (int i = 0; i < 3; i++)
         {
            serialPort1.Write(dizi[2 * i]);
            serialPort1.Write(dizi[2 * i + 1]);
            System.Threading.Thread.Sleep(300);
            serialPort1.Write("0");
         }
            checkBox1.Checked = false;
      }
   }
}
 
Son düzenleme:

Çevrimiçi personel

Forum istatistikleri

Konular
5,788
Mesajlar
99,004
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top