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


Anmelden zum Antworten