Mehrere Threads aufrufen und Daten in den Hauptthread übergeben

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Passend zu dem Thema hätte ich noch ein Problem.

    Ich lasse die Kollisions-Überprüfung in einem eigenen Thread laufen, damit das Programm während der Berechnung nicht einfriert, wenn große Datensätze vorliegen.

    Das Problem ist, das ich das jetzt durch die Parallel.For nicht mehr von Außen abbrechen kann. Also über einen Button_Click.

    Hier der schematische Code. Wie könnte man das lösen???

    VB.NET-Quellcode

    1. Private Sub Btn_Simulation_Click(sender As Object, e As EventArgs) Handles Btn_Simulation.Click
    2. Dim _th As New Thread(AddressOf GetCollisionEntities)
    3. End Sub
    4. Private Sub Chk_FirstKollision_CheckedChanged(sender As Object, e As EventArgs) Handles Chk_FirstKollision.CheckedChanged
    5. If Firstload Then Return
    6. If Chk_FirstCollision.Checked = True Then
    7. StopAfterFirstCollision = True
    8. Else
    9. StopAfterFirstCollision = False
    10. End If
    11. End Sub
    12. Private Sub GetCollisionEntities()
    13. ' Alles vorbereiten für die Kollisionsprüffung
    14. '
    15. '
    16. ' ...........
    17. ' ############################################################
    18. ' KOLLISIONSPÜPFFUNG
    19. ' ############################################################
    20. Using cancelToken As CancellationTokenSource = New CancellationTokenSource()
    21. Dim options As ParallelOptions = New ParallelOptions()
    22. options.CancellationToken = cancelToken.Token
    23. options.MaxDegreeOfParallelism = 4
    24. ProgressBar1.Visible = True
    25. ProgressBar1.Minimum = 0
    26. ProgressBar1.Maximum = 1000
    27. ProgressBar1.Value = 0
    28. ProgressBar1.Step = 1000 / cs.CollisionsPointList.Count
    29. Try
    30. Parallel.For(0, cs.CollisionsPointList.Count, options, Sub(n)
    31. ' ############################################################################
    32. ' PROBLEM, ==> Kann die Parallel.For nicht durch einen Button_Click abbrechen
    33. ' ############################################################################
    34. If StopAfterFirstCollision And icc.Count > 0 Then
    35. ' Sobald eine Kollision gefunden wird, wird die Parallel.For unterbrochen
    36. ' Der Boolean wird aber davor schon gesetzt durch die CheckBox
    37. cancelToken.Cancel()
    38. End If
    39. End Sub)
    40. Catch ex As Exception
    41. End Try
    42. End Using
    43. Next
    44. Next
    45. ' #######################
    46. ' Weiter im Sub
    47. ' #######################
    48. End Sub
    Na lecker. Irgendwelcher zerhackstückelter Code, der nicht kompiliert.

    VB.NET-Quellcode

    1. If Chk_FirstCollision.Checked = True Then
    2. StopAfterFirstCollision = True
    3. Else
    4. StopAfterFirstCollision = False
    5. End If

    ->

    VB.NET-Quellcode

    1. StopAfterFirstCollision = Chk_FirstCollision.Checked

    Zeile#53: Der Unterschied zwischen And und AndAlso/Or und OrElse

    Aber nun zu einer möglichen Lösung: Beseitige den Using Block. Mach die CTS klassenweit verfügbar, erzeuge eine neue Instanz in Zeile#4 und dann kannst Du auch mit einem ButtonClick die CTS canceln. Und nach Threadende kannst Du die CTS disposen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private cts As New CancellationTokenSource
    3. '…
    4. Private Sub GetCollisionEntities()
    5. options.CancellationToken = cts.Token
    6. '…
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. cts.Cancel()
    9. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.