SORU
27 Mayıs 2012, Pazar


Çapraz iş parçacığı işlemi geçerli değil: 'textBox1' bir konu oluşturulduğu iş parçacığı dışında başka Erişim Kontrolü

C mikroişlemci kullanarak bir UART sıcaklık değeri göndermek istiyorum# arayüzü ve Ekran sıcaklık *4.* Burada mikroişlemci benim kod:

   while(1){
   key_scan();// get value of temp
if (Usart_Data_Ready())
                {
                   while(temperature[i]!=0)
                    {
                    if(temperature[i]!=' ')
                    {
                      Usart_Write(temperature[i]);
                      Delay_ms(1000);
                    }
                    i = i   1;
                    }
                  i =0;
                  Delay_ms(2000);
                }
     }

ve benim C# kodu

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        txt  = serialPort1.ReadExisting().ToString();
        textBox1.Text = txt.ToString();
    }

ama durum orada doğar "Çapraz iş parçacığı işlemi geçerli değil: Kontrol 'textBox1' bir iş parçacığı iş parçacığı dışındaki erişilen oluşturulduğu" Lütfen benim mikroişlemci sıcaklık dize nasıl söyle ve bu Hatayı düzeltin!

CEVAP
27 Mayıs 2012, Pazar


Veri serialPort1_DataReceived yöntem alınan UI iş parçacığı dışında başka bir iş parçacığı içeriği geliyor ve bu hatayı görmek nedeni budur.
Bu sorunu çözmek için, TechNet makalesinde descibed gibi bir dağıtıcı kullanmak zorunda olacak:
How to: Make Thread-Safe Calls to Windows Forms Controls

Doğrudan metin özelliği serialport1_DataReceived yöntemi ayarlamak yerine, bu deseni kullanın:

delegate void SetTextCallback(string text);

private void SetText(string text)
{
  // InvokeRequired required compares the thread ID of the
  // calling thread to the thread ID of the creating thread.
  // If these threads are different, it returns true.
  if (this.textBox1.InvokeRequired)
  { 
    SetTextCallback d = new SetTextCallback(SetText);
    this.Invoke(d, new object[] { text });
  }
  else
  {
    this.textBox1.Text = text;
  }
}

Senin durumunda:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  txt  = serialPort1.ReadExisting().ToString();
  SetText(txt.ToString());
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • AutoStream's Garage419

    AutoStream's

    15 EKİM 2007
  • Michelle Phan

    Michelle Pha

    18 Temmuz 2006