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???
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
- Private Sub Btn_Simulation_Click(sender As Object, e As EventArgs) Handles Btn_Simulation.Click
- Dim _th As New Thread(AddressOf GetCollisionEntities)
- End Sub
- Private Sub Chk_FirstKollision_CheckedChanged(sender As Object, e As EventArgs) Handles Chk_FirstKollision.CheckedChanged
- If Firstload Then Return
- If Chk_FirstCollision.Checked = True Then
- StopAfterFirstCollision = True
- Else
- StopAfterFirstCollision = False
- End If
- End Sub
- Private Sub GetCollisionEntities()
- ' Alles vorbereiten für die Kollisionsprüffung
- '
- '
- ' ...........
- ' ############################################################
- ' KOLLISIONSPÜPFFUNG
- ' ############################################################
- Using cancelToken As CancellationTokenSource = New CancellationTokenSource()
- Dim options As ParallelOptions = New ParallelOptions()
- options.CancellationToken = cancelToken.Token
- options.MaxDegreeOfParallelism = 4
- ProgressBar1.Visible = True
- ProgressBar1.Minimum = 0
- ProgressBar1.Maximum = 1000
- ProgressBar1.Value = 0
- ProgressBar1.Step = 1000 / cs.CollisionsPointList.Count
- Try
- Parallel.For(0, cs.CollisionsPointList.Count, options, Sub(n)
- ' ############################################################################
- ' PROBLEM, ==> Kann die Parallel.For nicht durch einen Button_Click abbrechen
- ' ############################################################################
- If StopAfterFirstCollision And icc.Count > 0 Then
- ' Sobald eine Kollision gefunden wird, wird die Parallel.For unterbrochen
- ' Der Boolean wird aber davor schon gesetzt durch die CheckBox
- cancelToken.Cancel()
- End If
- End Sub)
- Catch ex As Exception
- End Try
- End Using
- Next
- Next
- ' #######################
- ' Weiter im Sub
- ' #######################
- End Sub