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

  • Candyrat Records

    Candyrat Rec

    10 Mayıs 2006
  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011