Result von Serialport.read im neuen Thread an Main Form übergeben

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Result von Serialport.read im neuen Thread an Main Form übergeben

    Hallo,

    ich habe folgende Frage:
    Momentan läuft in der Main ein Timer (alle 5000ms). Innerhalb des Timers wird ein Serialport zu einer Arduino Platine geöffnet und ich frage eine ganze menge ab und empfange auch ganz viel (Write und Read bestimmt 20 mal hintereinander, Serialport wird wieder geschlossen und nach 5 Sek. beginnt wieder alles von vorne). Das klappt fast problemlos möchte man meinen (bricht leider alle paar Tage ab) Das Programm läuft 24/7 auf einem Windows 7 Rechner.
    Die Ausführung des Timers bringt die GUI alle 5 Sekunden für ca. 3 Sekunden zum stehen.

    Jetzt habe ich mir gedacht, nimm alles was im Timer passiert aus der Main raus und lass es in einem Background Thread laufen. Danach übergib nur die neuen Werte an die Main, damit diese dann z.B. in einem Label dargestellt werden können.

    Dieses Übergeben der Werte vom Thread zurück an die Main ist mir unklar. - Also ich weiß gar nicht wie das gehen soll. Har hier Jemand vielleicht eine Idee?
    Ich nehme an du verwendest den Windows.Forms.Timer?

    Nimm vielleicht einfach den System.Timers.Timer und verwende invoke wenn du auf die GUI zugreifen musst.

    Beispiel:

    VB.NET-Quellcode

    1. Private Sub timer_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs)
    2. Dim r As [String] = Thread.CurrentThread.ManagedThreadId.ToString()
    3. System.Threading.Thread.Sleep(2000) 'tue iwas Zeitaufwändiges
    4. Me.Invoke(DirectCast(Sub() richTextBox1.Text = r, Action))
    5. End Sub
    Das ist meine Signatur und sie wird wunderbar sein!

    sm2001sm schrieb:

    Serialport wird wieder geschlossen
    Wozu?
    Lass es offen über die Lebensdauer des Hauptprogramms.
    @Mono Jou.

    sm2001sm schrieb:

    zum stehen
    Kapsele Deine Datenverarbeitung in einer separaten Klasse, da ist es egal, von wo sie aufgerufen wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was du auch versuchen kannst, ist dein Abfragen in einen Task(Of TResult) zu packen, dir eine Klasse bauen(EDIT: wie RodFromGermany bereits gesagt hat, die Datenverwaltung in eine Klasse kapseln), welche die Werte verwaltet. Vor Beenden des Task erzeugst du ein Objekt deiner Daten-Haltungsklasse, füllst sie mit den gelesenen Daten und gibst das Objek zurück. In deinem Hauptrogramm startest du den Task und weist nach Beenden das Ergebnis einer Instanz-Variable zu. Die kannst du dann ganz bequem darstellen.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radinator“ ()