Thread beendet prüfen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Thread beendet prüfen

    Hallo,

    ich habe Funktionen welche auf eine

    VB.NET-Quellcode

    1. List(of Structure)
    zugreifen.

    Diese

    VB.NET-Quellcode

    1. List(of Structure)
    wird in einem Thread gefüllt, weil sich sonst die Form total aufhängen würde.

    Jetzt greife ich aber in einem Form_Event, genauer gesagt

    VB.NET-Quellcode

    1. NumericUpdown_ValueChanged
    Event auf diese Funktionen zu, das Event reagiert ja schon beim laden der Form und es führt selbstverständlich zu einem Error, weil die

    VB.NET-Quellcode

    1. List(of Structure)
    noch nicht gefüllt ist.

    Jetzt muss ich irgendwie abfragen, ob der Thread zuende gearbeitet hat.

    Ich hatte mir gedacht in der Klasse eine globale Booleanvariable anzulegen welche man auch von außerhalb abfragen kann.

    Im

    VB.NET-Quellcode

    1. NumericUpDown_ValueChanged
    Event frage ich also die Variable aus der Klasse ab um rauszufinden ob die Liste voll ist, -> Scheitert.

    Ich habe auch schon versucht, den Thread in der Klasse halt global zu machen und in der Funktion den

    VB.NET-Quellcode

    1. Threadstate
    abzufragen aber das funktioniert auch nicht.


    Falsch ich mich eurer Meinung nach nicht ausreichend genug ausdrücke, so bitte ich mir das mitzuteilen.

    Kann mir jemand sagen wie ich das am besten löse?

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

    Du hast die Variable Thread.IsAlive. Ist sie True, arbeitet der Thread noch.
    Wenn sie False ist, kannst Du auf Deine List(Of ) zugreifen
    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!

    RodFromGermany schrieb:

    Du hast die Variable Thread.IsAlive. Ist sie True, arbeitet der Thread noch.
    Wenn sie False ist, kannst Du auf Deine List(Of ) zugreifen

    Ist mir klar. Hatte ich vergessen zu erwähnen, das ist ja eigentlich die bekannteste Methode.
    Genau das funktioniert aber eben nicht.

    Ich prüfe ja im

    VB.NET-Quellcode

    1. NumericUpDown_ValueChanged
    Event

    VB.NET-Quellcode

    1. If Not c.S.IsAlive Then c.GenerateThatt(RichTextBox2.Text, CInt(NumericUpDown1.Value))
    2. ' c = die Instanz der Klasse
    3. ' S = der Thread , in der Klasse global deklariert


    Das haut mir troztdem die Meldung raus:

    VB.NET-Quellcode

    1. Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException.
    2. Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt..

    Kevin Hombre schrieb:

    Das haut mir troztdem die Meldung raus:

    Kein Wunder, den Thread gibt es halt nicht mehr. Richte Dir am besten eine Property mit folgender Abfrage ein:

    VB.NET-Quellcode

    1. Public ReadOnly Property threadIsActive() As Boolean
    2. Get
    3. myThread IsNot Nothing AndAlso myThread.IsAlive) '<--- für myThread richtige Bezeichnung einsetzen
    4. End Get
    5. End Property
    Hi
    hat es einen Grund, warum du die Liste unter Verwendung eines Threads erzeugst? Ansonsten kannst du System::Threading::Thread.Join verwenden, um auf die Beendigung der Prozedur zu warten, einige Synchronisationsmethoden aus System::Threading verwenden, wie z.B. System::Threading::ManualResetEvent oder System::Threading::AutoResetEvent.

    Gruß
    ~blaze~
    @blaze die Fragestellung ist berechtigt: allerdings sollte man blockierende Synchronisationsmethoden Thread.Join oder auch Monitor.Wait / ManualRestEvent vielleicht nicht gerade im GUI-Thread verwenden ;)

    Besser wäre es in dem Thread ein Event zu erzeugen wenn die Liste vollständig erzeugt wurde um dann im GUI Zweig darauf zu reagieren.

    Touche schrieb:

    Kein Wunder, den Thread gibt es halt nicht mehr. Richte Dir am besten eine Property mit folgender Abfrage ein:
    Danke! Das hat geholfen. Habs nun auch so gemacht.

    Edit: Code an den von haiyyu angepasst:

    VB.NET-Quellcode

    1. Public ReadOnly Property threadIsntActive() As Boolean
    2. Get
    3. Return S Is Nothing OrElse Not S.IsAlive
    4. End Get
    5. End Property



    Dann einfach Prüfen:

    VB.NET-Quellcode

    1. If threadIsntActive() then Function../Sub...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kevin Hombre“ ()

    Ich würd's ja so schreiben:

    VB.NET-Quellcode

    1. Public ReadOnly Property threadIsntActive() As Boolean
    2. Get
    3. Return S Is Nothing OrElse Not S.IsAlive
    4. End Get
    5. End Property