problemler

Problem:

Bugünlerde Dumlupınar Üniversitesi’nin Güneş Arabası Projesi için telemetri programı üzerinde çalışıyorum. C#’da hazırladığım bu programda o anki amacım seri port üzerinden veri alımı gerçekleştirmekti. Yeni bir proje açıp basit bir seri port veri alım kodlarını ve bu alınan verileri TextBox1 kontrolünde gösteren programı yazdım ama programı çalıştırdığımda “Cross-thread operation not valid: Control ‘TextBox1’ accessed from a thread other than the thread it was created on.” hatası verdi.

Problemin Nedeni:

Seri porttan veri geldiğinde seri portun “serialPort1_DataReceived” olayı meydana geliyor, aynı anda da TextBox kontrolünün “textBox1_TextChanged” olayı meydena geliyor. Bilgisayarın yapısı gereği aynı anda iki işlem yapamayacağından dolayı bu hatayı veriyor.

Çözümüm:

İnternette ve Microsoft MSDN’de yaptığım araştırmalar sonucu thread’lerin çakışması sonucu meydana gelen bu durum için çakışma olabilecek kodların çalışmasından önce (örneğin formun Load olayı)

CheckForIllegalCrossThreadCalls = false;

komutu kullanıldığında sorun düzelmektedir.

““Cross-thread operation not valid” Hatası” için 3 Yorum

  1. Çağatay says:

    Bu aslında gerçek yaşam kurallarına aykırı bir yöntem.
    Daha doğrusu istenmeyen bir yöntem.

    Aynı sorunla bende uğraşıyorum şuanda.
    invoke ve delegate kavramları üzerine düşülmesi gerekiyor.

  2. Delegate ile değil ama invoke ile yapılabiliyor. Hatta geçenlerde invoke ile yapılmış bir sample a rastladım (http://disk.yandex.com.tr/public/?hash=loXmCGsD3eRPHEH2L8REzKf7EvGDyZVluTI5QLzQE08%3D). Yine araştırırken invoke dışında daha farklı bir yöntem kullanarak bu sorunu çözmüş bir dökümantasyon buldum, açıkcası bu yöntem bana daha mantıklı geldi (http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx). Ama şuda bir gerçek ki artık RS232 ihtiyaçlarımı karşılamıyor. Bu yüzden RS232'ye göre yaklaşık 5000 kat daha hızlı ve hata oranı ihmal edilebilir seviyede olan USB iletişimine geçmeye kara verdim. Ancak itiraf etmeliyim ki USB protokolleri gerçekten beni çok zorladı, bununla ilgili sadece USB protokollerini anlayabilmek için ansiklopedi gibi 2 kitap devirdim ve yeni yeni oturmaya başladı diyebilirim. En yakın zamanda USB ile iletişim kurabilen bir devre tasarlamayı ve zaman bulabilirsem serkanayaz.com'da yayınlamayı düşünüyorum. İyi çalışmalar.

  3. Ayrıca bu hata sadece RS232 haberleşmesinde meydana gelmediğini farkettim. Bu hatanın gerçek nedeni bir thread içerisinde; thread’e dahil olmayan bir fonksiyon çağırıldığında bu hata meydana geliyor. Bu hata yukarıda bahsettiğim komut ile çözülebilmektedir ancak bu yöntem ÖNERİLMEMEKTEDİR…

Yorum Yap