WPF Programm Textbox aktualisieren
-
Hallo Forum,
seit kurzer Zeit mache ich meine ersten Gehversuche in WPF.Es sollen die vorhandenen COM Schnittstellen nach einen Gerät abgesucht werden. das klappt auch sehr gut.
Nun möchte ich den Nuter in einer Statuszeile (textbox) über den verlauf der Suche informieren.
Das war in Form´s keine große Sache, da es die Funktion DoEvents() gab.
Diese gibt es nicht unter WPF. Ich habe mir den ganzen Tag die Augen aus dem Kopf gegoogelt, ohne dabei fündig zu werden.Kann mir bitte man jemand auf die Sprünge helfen.
Funktion:
public void Verbinden_Click(object sender, RoutedEventArgs e) { string Kommando_1 ="I", Kommando_2 = "D"; char[] Antwort = new char[20]; byte nummer; int anzahl_byte; Com_Port = new SerialPort(); // User informieren Status_Meldung.Text = "Suche Regler"; // Erstmal nachsehen wieviele Ports es überhaupt gibt aktive_Ports = System.IO.Ports.SerialPort.GetPortNames(); Anzahl_Ports = aktive_Ports.GetLength(0); // Nun an allen Schnittstellen nach dem Regler suchen for (nummer = 0; nummer < Anzahl_Ports; nummer++) { // Gefundene COM-Ports öffnen und nach I2C-RS232-Modem suchen try { Com_Port.PortName = aktive_Ports[nummer]; // Einstellen der RS232 für Modem Com_Port.BaudRate = 19200; Com_Port.DataBits = 8; Com_Port.StopBits = StopBits.One; Com_Port.Parity = Parity.None; Com_Port.Open(); // Wenn der COM-Port offen ist, dann nach den Modems suchen if (Com_Port.IsOpen) { Com_Port.Write(Kommando_1); Thread.Sleep(10); Com_Port.Write(Kommando_2); // 100 mSec warten dann geht es weiter Thread.Sleep(100); // Wenn es eine Antwort gibt könnte sie vom Modem sein anzahl_byte = Com_Port.BytesToRead; if (anzahl_byte > 0) { Com_Port.Read(Antwort, 0, anzahl_byte); // String Ende anfügen string wert = new string(Antwort); // Wenn die Antwort richtig ist dann Schleife beenden if (string.Compare(wert, "SMD-Regler V 1.0") == 0) { Regler_Port = nummer; nummer = 254; } } Com_Port.Close(); } } // Auftretende Fehler werden einfach ignoriert catch { } } // Wenn ein Regler da ist dann RS232 Port öffnen if (Regler_Port > 0) { Com_Port.Open(); COM_Status.Text = "Online"; COM_Status.Background = Brushes.Lime; verbunden = true; } else { COM_Status.Text = "Offline"; COM_Status.Background = Brushes.Red; verbunden = false; } }
Leider wird bei diesem Code die Meldung "Suche Regler" erst am Ende der Suche in der Textbox dargestellt, wenn alles vorbei ist und nicht vor der Suche.
Was mache ich falsch!?!
Danke an alle die mithelfen.Gruß
Ingo
-
Hallo Ingo
ingo_46 schrieb:
Das war in Form´s keine große Sache, da es die Funktion DoEvents() gab.
Damit hast Du es in Winforms schon falsch gemacht. Application.DoEvents führt zum Wiedereintritt ("Reentrancy-Problem") von Eventhandlern bei Controls, wenn der Benutzer während einer langlaufenden Aktion die GUI bedient.
Das Stichwort ist Threading. Wie so oft in letzter Zeit.
-
Hallo µ,
danke für die Antwort.Gruß
Ingo