Problem bei Aktualisierung

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Morphesus.

    Problem bei Aktualisierung

    Halihalo,

    Ich hab 1 Problem bei der Aktualisierung von meinem VB-Programm.

    Und zwar: In der ersten Form aktualisieren sich ne Tabelle und mehrere Labels (ca. 100 Labels). Die Tabelle alle 12 Sekunden und die Labels alle 7,5 Sekunden.
    So und dann hab ich gleichzeitig eine Form auf in welche Daten eingegeben werden also in Textboxen.
    Das Problem das auftritt, das während der Eingabe in die Textboxen stoppt die eingabe immer für 3 Sekunden, dann kommt alles was man in den 3Sek geschrieben hat auf einmal, dann läuft die Eingabe wieder 3sek flüssig und immer so weiter.

    Ich bin ratlos und weiß net wie ich das hinkriege! :?: :?: ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FS-DU“ ()

    picoflop schrieb:

    Deine "aktualisierung" (dauert vermutlich run 3 Sekunden ... ;) ) legt den GUI-Thread lahm.
    Abhilfe: Aktualisierung in einen anderen Thread auslagern. Achtung! Zugriff auf Controls dann nur via Invoke etc!

    Dem schließe ich mich ohne Weiteres an! Mein Tipp noch: Nutze den BackgroundWorker, der sollte auch funktionieren, wenn ich richtig liege... Ansonsten einfach nen Thread selber basteln, so schwer ists ja nicht ;)

    lg Morph
    Ich hab leider keine Ahnung wie ich das in einen Thread auslager und dazu auch nichts bei Google oder hier gefunden..

    Und in den Backgroundworker, was soll ich den tuen lassen? Weil die Befehle sind ja in einem Timer damit die Übersicht nur alle 5 Sekunden aktualisiert wird... also den Timer im backgroundworker starten`??

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim t As New Threading.Thread(AddressOf Thread)
    3. t.Start()
    4. End Sub
    5. Public Function Thread()
    6. MessageBox.Show("Hello World")
    7. Return Nothing
    8. End Function


    Ein Thread ist quasi eine weitere eigenständige Instanz, die dem Programm angehört.

    lg Morph
    Timer... Ich empfehle dir lieber eine Schleife zu nehmen...

    VB.NET-Quellcode

    1. While True
    2. ' Dein Code
    3. End While

    Du kannst das ganze ja jederzeit beenden! Indem du deinen Thread einfach anhältst:

    VB.NET-Quellcode

    1. t.Suspend()

    Wenn es dann weitergehen soll, dann sagst du entweder:

    VB.NET-Quellcode

    1. t.Resume()
    um die vorherige Ausführung fortzusetzen oder

    VB.NET-Quellcode

    1. t.Start()
    , um den Thread neuzustarten.

    lg Morph
    Also ganz nebenbei, der erste Fehler ist beseitigt..

    Im erstenteil starte ich den Thread:

    VB.NET-Quellcode

    1. Sub aktualisieren()
    2. Dim t As New Threading.Thread(AddressOf Thread)
    3. t.Start()
    4. End Sub

    Da weiß ich nicht was ich bei "AddressOf Thread" einsetzt muss. "NamederForm.t" ?!

    VB.NET-Quellcode

    1. Public Function Thread()
    2. While CheckBox1.Checked = True
    3. '<Mein Code für die Aktualisierung>
    4. Return Nothing
    5. End While
    6. End Function

    Da weiß ich nicht wo das "T" hin muss als Name für den Thread..

    1 Warnung gibt es:
    Die Thread-Funktion gibt nicht für alle Codepfade einen Wert zurück. Wenn das Ergebnis verwendet wird, kann zur Laufzeit eine Nullverweisausnahme auftreten.


    Und was davon packe ich dann noch in nen Backgroundworker?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FS-DU“ ()

    FS-DU schrieb:

    Also ganz nebenbei, der erste Fehler ist beseitigt..

    Im erstenteil starte ich den Thread:

    VB.NET-Quellcode

    1. Sub aktualisieren()
    2. Dim t As New Threading.Thread(AddressOf Thread)
    3. t.Start()
    4. End Sub

    Da weiß ich nicht was ich bei "AddressOf Thread" einsetzt muss. "NamederForm.t" ?!

    VB.NET-Quellcode

    1. Public Function Thread()
    2. While CheckBox1.Checked = True
    3. '<Mein Code für die Aktualisierung>
    4. Return Nothing
    5. End While
    6. End Function

    Da weiß ich nicht wo das "T" hin muss als Name für den Thread..

    1 Warnung gibt es:
    Die Thread-Funktion gibt nicht für alle Codepfade einen Wert zurück. Wenn das Ergebnis verwendet wird, kann zur Laufzeit eine Nullverweisausnahme auftreten.


    Und was davon packe ich dann noch in nen Backgroundworker?

    Du benötigst keinen BackgroundWorker mehr, wenn du einen Thread benutzt ;)

    VB.NET-Quellcode

    1. Sub aktualisieren()
    2. Dim t As New Threading.Thread(AddressOf ThreadFunc) ' Thread als Funktionsname eher ungeeignet, da Thread bereits eine Klasse ist
    3. t.Start()
    4. End Sub


    VB.NET-Quellcode

    1. Public Function ThreadFunc()
    2. While CheckBox1.Checked = True
    3. '<Mein Code für die Aktualisierung>
    4. End While
    5. Return Nothing
    6. End Function


    Bei einem Return wird die Funktion beendet. Wenn Die CheckBox nicht gecheckt ist wird die While Schleife nicht aufgerufen, folglich kommt es nicht zu einem Return. Ein Return ist jedoch bei einer Funktion notwendig!

    Probier das nochmal aus!

    lg Morph
    Hey vielen Dank,
    Es kommen jetzt schonmal keine Fehlermeldung während des Programmierens
    Aber wenn er das ausführt dann "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt"
    "The Connection is already open" und Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Label1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde" <- Und Die Meldung kommt immer mit den verschiedenen Labels die aktualisiert werden sollen

    picoflop schrieb:

    Deine "aktualisierung" (dauert vermutlich run 3 Sekunden ... ) legt den GUI-Thread lahm.
    Abhilfe: Aktualisierung in einen anderen Thread auslagern. Achtung! Zugriff auf Controls dann nur via Invoke etc!

    Deswegen wird es wohl nicht gehen ;) Eine Möglichkeit ist, dass du statische Objekte verwendest... Bzw. in VB sind diese durch das Schlüsselwort 'Shared' gekennzeichnet.

    Hier ein Beispiel:

    VB.NET-Quellcode

    1. Public Shared Sub Test()
    2. MessageBox.Show("Dies ist eine statische Funktion!")
    3. End Sub


    Du kannst diese Funktionen wie folgt aufrufen:

    VB.NET-Quellcode

    1. Public Class Test
    2. Public Shared Sub Test()
    3. MessageBox.Show("Dies ist eine statische Funktion!")
    4. End Sub
    5. End Class
    6. Public Class Test2
    7. Public Sub BlaBla
    8. Test.Test() ' Richtig! Du musst KEIN OBJEKT dieser Klasse erzeugen, um die Funktion nutzen zu können.
    9. End Sub
    10. End Class


    Versuch dies mal auf das Control, welches du nicht Threadübergreifend ansprechen kannst. Aber Vorsicht! Es können Laufzeitfehler entstehen und der Inhalt der Variablen kann sich verändern - mir ist es bislang noch nicht passiert, es soll aber möglich sein.

    lg Morph