Laden...

Form startet nicht bei einer while Schleife

Erstellt von Goofigoofi vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.239 Views
G
Goofigoofi Themenstarter:in
25 Beiträge seit 2020
vor 4 Jahren
Form startet nicht bei einer while Schleife

Hallo zusammen,

ich bin noch neu auf diesem Gebiet und habe folgendes Problem.
Ich empfange Daten vom OPC-Server und möchte diese zyklisch aktualisieren.
Wenn ich das ganze in eine while, for oder do Schleife packe startet Form nicht mehr, wenn ich das über einen Button starte hängt sich das Programm an der Stelle auf.

private void Form1_Load(object sender, EventArgs e)
        {
            using (var client = new OpcClient("opc.tcp://10.14.9.89:4861"))
            {
                client.Connect();

                while (true)
                {
                    var v_Trommel_ist = client.ReadNode("ns=3;s=v_Trommel_ist");

                    this.textBox1.Text = Convert.ToString(v_Trommel_ist);                    

                    Thread.Sleep(1000);
                }
            }
        }

woran kann das liegen? bin schon am verzweifeln

16.842 Beiträge seit 2008
vor 4 Jahren

Du hast eine Endlosschleife programmiert, die dauernd durchläuft; daher reagiert nichts mehr.
Prinzipiell ist die gesamte Art, wie Du den Code gestaltet hast, suboptimal.
Das hättest Du übrigens selbst via [Artikel] Debugger: Wie verwende ich den von Visual Studio? herausfinden können 😉

  1. Solche Abfragen müssen in einem Thread oder Task abgelegt werden, sonst passiert genau das: [FAQ] Warum blockiert mein GUI?. IO-Code, egal ob mit Datenbanken, Dateien, Servern... sollte nie im UI-Thread arbeiten. Nie.
  2. Solche Schleifen solltest Du generell meiden; weil dies einem Polling Prinzip entspricht. Modernere OPC/OPC-UA Bibliotheken werfen Events, sobald neue Daten existieren. Dann muss man nichts abfragen sondern bekommt direkt eine Info, wenn es neue Daten gibt
  3. [Artikel] Drei-Schichten-Architektur
G
Goofigoofi Themenstarter:in
25 Beiträge seit 2020
vor 4 Jahren

Hallo Abt,

vielen Dank für die Tipps. Wie geschrieben ich bin noch Anfänger und für jeden Tipp dankbar. Aber ich verstehe nicht wie das mit dem OPC/OPC-UA Bibliotheken Events funktionieren soll. Google hat mich nur noch mehr verwirrt.
Hättest Du da noch einen Tipp oder einen Ansatz wie ich vorgehen soll?

T
2.224 Beiträge seit 2008
vor 4 Jahren

@Goofigoofi
Mit Events mein Abt, dass z.B. die OpcClient bestimmte Events anbieten dürfte.
Hier musst du dann eine Methode, die als Event Handler gesetzt werden kann, vom OpcClient beim empfang von Daten aufgerufen werden könnte.
Dazu solltest du dich mit Events in .NET generell einlesen, da du damit keine Schleifen Lösungen brauchst sondern die jeweilige Klasse über die Events dir dann mitteilt, wenn bestimmte Aktionen durchgeführt werden/wurden.

Somit kannst du auf die Schleife verzichten und hast dann auch keine blockierende UI mehr.

Events

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.842 Beiträge seit 2008
vor 4 Jahren

Hättest Du da noch einen Tipp oder einen Ansatz wie ich vorgehen soll?

Letzten Endes ist es so, dass gewisse Regeln jeder beachten muss; egal ob Anfänger oder Profi.
Hält man sich nicht dran, dann reagiert die Anwendung eben nicht mehr.
Die FAQ richtet sich aber vor allem an Anfänger - daher kannst Du die ruhig lesen 😃

Ansonsten kann ich Dir zu Deinem OPC Thema auch nicht helfen; ich kann schließlich auch nicht hellsehen, welche Bibliothek oder welches SDK Du verwendest - es gibt hunderte wenn nicht gar tausende OPC Classic/OPC-UA Bibliotheken.
Vielleicht unterstützt Deine Bibliothek nur Polling und bietet gar keine Events für OPC Messages an.. ich weiß es nicht.
Ich weiß ehrlich gesagt nicht mal ob Du OPC Classic oder OPC UA meinst - Du schreibst nur OPC.

Wenn Dir die aktuelle nicht passt, dann gehört es zu den Aufgaben dazu, dass man mehrere Bibliotheken ausprobiert und evaluiert.
Es kann auch sein, dass Du einen Fall hast, bei dem man Polling verwenden muss, was relativ wenige Fälle sind (zumindest bezogen auf OPC/OPC-UA).

Ansonsten ist Dein Problem eigentlich "nur", dass Du eben IO Zugriff mit der Schleife im UI-Thread hast.
Und das führt eben dazu, dass die Anwendung einfriert; und das ist erklärt in [FAQ] Warum blockiert mein GUI?
Prinzipiell sollte man das mit allen Operationen machen, die länger als 50ms dauern können; ansonsten kann die entsprechende Warnung von Windows kommen, dass die Anwendung nicht mehr reagiert.

Wenn Dir das in der Form jetzt zu schwer ist, dann beginne erst mal mit den allgemeinen Grundlagen.
Es wird nämlich sehr schwer eine ordentliche Anwendung zu schreiben, wenn man die Grundlagen von gewissen Dingen nicht verinnerlicht hat. 😃

Letzten Endes musst Du auch viel ausprobieren, lesen etc. Das ist halt der Job.
Mit der Erfahrung kommst Du dann auch aus dem Status des Anfängers raus 😉

Das Forum kann Dir prinzipiell halt vor allem bei konkreten Probleme helfen.
Und basierend auf dem Thema hier ist es halt, dass wir Dir sagen können, dass das so in der Form ohne ausgelagert in einen Thread ein Fehler ist.

G
Goofigoofi Themenstarter:in
25 Beiträge seit 2020
vor 4 Jahren

Hab mir mal eben kurz ein 100 Seiten PDF reingezogen -> jetzt hab ich's auch gecheckt.
Funktioniert super.

Danke an Abt und T-Virus !!!
👍 👍