threads richtig pausieren und beenden

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Denis_Class.

    threads richtig pausieren und beenden

    Hei Leute!

    Ich hab ne kurze frage.

    Ich hab in meinem Tool nun nach riesen perfomance Problemen und ein gefrorenen Forms begonnen mich mit threading zu befassen.

    Ich starte meine threads mit "threadname.Start()"
    Zum pausieren habe ich nun das vorgeschlagene "threadname.suspend" verwendet.

    Hier erhalte ich "leider" eine Warnung dass diese Methode veraltet sei. Funktionieren tut es zwar aber wie kann ich das besser lösen?
    Hey,

    wenn Deine Anwendung so performancehungrig ist, wieso willst Du einen Thread pausieren? Wenn Du Threads synchronisieren willst, dann schlägt Dir die IDE ohnehin alternativen zur "missbilligten" Mehtode vor:


    Warnung 2 "Public Sub Suspend()" ist veraltet: "Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. go.microsoft.com/fwlink/?linkid=14202". C:\Users\Spacey\Documents\Visual Studio 2012\Projects\WindowsApplication45\WindowsApplication45\Form1.vb 58 9 WindowsApplication45


    Oder Du nutzt Thread.Sleep(), wenn Du nur eine Pause einlegen willst. Was aber in den meisten Fällen sinnlos ist. Wollte das nur gesagt haben.

    Threads beenden sich in der Regel selber. Sprich, die Methode, die sie ausführen wird beendet, somit wird auch der Thread beendet. Willst Du eine Thread vor Beendigung seiner Arbeit abbrechen, so nutze Flag, die regelmässig abgefragt werden, die ihn aus der Methode springen lassen. Thread.Abort() solltest Du Dir gar nicht erst angewöhnen, Threads werden beerdigt, wenn sie mit Ihrer Aufgabe fertig sind.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich habe folgenden Beitrag gefunden. Der beschreibt dein Anliegen meiner Meinung nach sehr gut:


    The good alternatives all work by the thread reaching a point where it is happy to wait. Suspend was dangerous because it could suspend the thread while it was holding a lock on a mutex - a recipe for deadlocks.

    So what your thread needs is a ManualResetEvent that it can Wait on - at a time when it is safe for it to do so, when it is not holding any locks.

    Quelle

    EDIT: Zu langsam ;(
    Lerne aus den Fehlern Anderer! Du hast nicht die Zeit sie selbst zu machen. :thumbup:

    Option Strict On :thumbsup: - Warum?

    weitere infos

    Um die Unklarheiten zu beseitigen:

    Die threads sollen zb. Dgvs mit extrem vielen Daten befüllen.
    Der user soll weiterhin die möglichkeit haben andere Tools des Programms nutzen zu können.
    Startet der user so ein befüllen eines dgvs öffnet sich eine Form die ihm mit einer pb den Fortschritt anzeigt. Ebenso beinhaltet diese "popup Form" einen Prozess pausieren Button und einen beenden Button der den thread beendet. Dies ist notwendig wenn der user feststellt dass er fürs füllen des dgvs falsche suchfilter eingestellt hat. Daher reicht mir das selbstständige beenden nach Abschluss des threads nicht.
    Ich hoffe ihr versteht nun was ich meine.

    Die Tipps werde ich mal umsetzen.

    SpaceyX schrieb:

    Hey,

    Willst Du eine Thread vor Beendigung seiner Arbeit abbrechen, so nutze Flag, die regelmässig abgefragt werden, die ihn aus der Methode springen lassen. Thread.Abort() solltest Du Dir gar nicht erst angewöhnen, Threads werden beerdigt, wenn sie mit Ihrer Aufgabe fertig sind.



    Okay,verstanden. Aber wie nutze ich flags in einem thread?
    Kann ich mehrere flags nutzen?
    Also eins für pause, eins für stopp usw.
    Ein ganz einfaches Beispiel. Wobei es mir schleiferhaft ist, warum man einen Thread pausieren soll. Dann lieber sauber beenden und bei Bedarf wieder weiterarbeiten lassen. Aber gut, Deine Sache.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _cancelThread As Boolean = False
    3. Private _pauseThread As Boolean = False
    4. Private _timeOut As Integer = 0
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim t As New Threading.Thread(AddressOf DoWork)
    7. _cancelThread = False
    8. _pauseThread = False
    9. t.Start()
    10. End Sub
    11. Private Sub DoWork()
    12. Dim l As Double = 0
    13. Do
    14. If _cancelThread Then Exit Do
    15. If _pauseThread Then
    16. _pauseThread = False
    17. Threading.Thread.Sleep(_timeOut)
    18. End If
    19. l += 0.001 'Irgendwas machen.
    20. If l > 10000 Then Exit Do
    21. Loop
    22. MessageBox.Show("Thread exited")
    23. End Sub
    24. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    25. _cancelThread = True
    26. End Sub
    27. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    28. _timeOut = 1000
    29. _pauseThread = True
    30. End Sub
    31. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Danke für deine Hilfen. :)


    Nur sleep mag ich mal gar nich! Denn beim sleep kann ich diesem thread keine neuen befehle senden wie beim suspense.
    Da frier ich den thread ja komplett ein.
    Und bin dann gezwungen den sleep komplett abwarten.