2016-12-06 2 views
-1

Ich möchte eine serielle Zeichenfolge und Anzeige in einem Textfeld erhalten, habe gestern eine Frage zur Verwendung des Hintergrundarbeiters gestellt, ich habe viel Hilfe bekommen, danke, konnte aber immer noch nicht lösen . Also habe ich ein neues, einfaches Projekt gestartet: Form 1 hat ein Textfeld, um den Rückgabewert anzuzeigen, 1 Taste, um den COM-Port zu verbinden, 1 Taste, um die serielle Verbindung zu senden. Wenn das Gerät am COM-Port die? gesendet, gibt es eine Zeichenfolge zurück, die ich in dem Textfeld tbEncoderValue anzeigen möchte. Serielle Coms werden von SerialPortClass verarbeitet. In SetText ist der Fehler aufgetreten. Was ist die beste & einfachste Art, in diese Textbox zu schreiben?Serielle Eingabe in Textbox - Kreuzfadenoperation

Form1: EDIT Minimierte verion geschrieben

namespace TestSensor 
{ 
    public partial class Form1 : Form 
    { 
     public static TextBox tbE = new TextBox(); 

     // create a SerialPortClass object variable and called it sp 
     SerialPortClass sp = new SerialPortClass();  

     public Form1() 
     { 
      InitializeComponent(); 
      tbEncoderValue.Text = "0000"; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      tbE = tbEncoderValue; 
     } 
    } 
} 

SerialPortClass:

namespace TestSensor 
{ 
    public class SerialPortClass : Form 
    { 

     internal delegate void SerialDataReceivedEventHandlerDelegate(
       object sender, SerialDataReceivedEventArgs e); 

     string InputData = String.Empty; 

     public SerialPortClass() 
     { 
      serialPort1.DataReceived += 
        new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1); 
     } 

     private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e) 
     { 
      Console.WriteLine("Data recieved"); 
      InputData = serialPort1.ReadExisting(); 
      if (InputData != String.Empty) 
      { 
       SetText(InputData); 
      } 
     } 

     public void SetText(string text) 
     { 
      Console.WriteLine("set text"); 
      Console.WriteLine(text); 
      Form1.tbE.Text = text; //causes cross thread operation error here 
     } 

     } 
} 


Form1.tbE.Text = text; //causes cross thread operation error here 

Nach der Lektüre @ Pavieł Kraskouski Kommentar wieder habe ich jetzt habe, wenn die serielle zu InvokeMethod empfangen und eine feste Zeichenfolge angezeigt , aber würdest du bitte string variable übergeben?

 public delegate void InvokeDelegate(); 

     public void SetText(string text) 
     { 
      Console.WriteLine("set text"); 
      Console.WriteLine(text); 

      Form1 fm = new Form1(); 

      Form1.tbE.BeginInvoke(new InvokeDelegate(InvokeMethod)); 

     } 

     public void InvokeMethod() 
     { 
      Form1.tbE.Text = "Executed delegate"; 
     } 
+0

Versuchen Sie, ein [* minimiert *] (http://stackoverflow.com/help/mcve) Version des Codes zu veröffentlichen, zu erklären, wo der Fehler auftritt. – RandomStranger

+0

Sie können Ihre Steuerelemente nicht in anderen Threads aktualisieren. Sie sollten die 'Control.BeginInvoke()' - Methode verwenden, um Cross-Thread-Operationen für Steuerelemente auszuführen. –

+0

@Bas ich gepostet minimierte Version vor und dann möchte jemand den ganzen Code ... Fehler tritt auf: Form1.tbE.Text = Text; // verursacht Cross-Thread-Operation Fehler hier – chasher

Antwort

0

Mit dank @Paviel weiß, ich habe: was funktioniert, aber ich glaube nicht, eine Klassenvariable ist der beste Weg Zeichenfolge in die InvokeMethod der Weitergabe verwenden, keine Kommentare bitte?

public delegate void InvokeDelegate(); 

private string textToDisplay; 

public void SetText(string text) 
{ 
    Form1 fm = new Form1(); 

    Console.WriteLine("set text"); 
    Console.WriteLine(text); 
    textToDisplay = text; 
    Form1.tbE.BeginInvoke(new InvokeDelegate(InvokeMethod));  
} 

public void InvokeMethod() 
{ 
    Form1.tbE.Text = textToDisplay; 
} 
0

Sie können die Methode invoker delegate verwenden und den Text in Ihrer setText-Methode festlegen.

this.Invoke((MethodInvoker)delegate{ tbE.Text = textToDisplay; }); 

oder aus dem Code:

public void SetText(string text) 
{ 
    Form1 fm = new Form1(); 

    Console.WriteLine("set text"); 
    Console.WriteLine(text); 
    textToDisplay = text; 
    fm.Invoke((MethodInvoker)delegate{ tbE.Text = textToDisplay; });  
} 
Verwandte Themen