Hallo,
habe ein kleines Problem mit Threads.
Mal ein Ausschnitt aus meiner Klasse:
Ich würde es gerne so haben, dass man "Start" aufruft, und angeben kann, wie oft nun die Aufgabe gleichzeitig gemacht werden soll. Wenn ich also .Start(3) aufrufe, wird ja _doWork() 3x aufgerufen und jedesmal wird "zurzeit" um 1 erhöht. Wenn die Aufgabe also erledigt wurde, und "zurzeit" noch nicht "gesamt" erreicht hat, soll _doWork() erneut aufgerufen werden. Somit müsste ja nun _doWork() die ganze Zeit 3x gleichzeitig laufen, mit dem Unterschied, dass das nächste Item aus "_list" genommen wird.
Das Problem ist nun aber, dass am Ende auch 3x die MsgBox angezeigt wird und ich komm nicht drauf, wie ich das ändern muss, damit sie wirklich nur einmal aufpoppt, und zwar wenn alle Aufgaben erledigt wurden.
Achja, ein weiteres Problem ist, das immer mal wieder am Anfang die zwei selben Einträge aus _list genommen werden..also:
Woran könnte das liegen? Ist auch nur manchmal so..
Hoffe jemand hat das so in etwa verstanden..
habe ein kleines Problem mit Threads.
Mal ein Ausschnitt aus meiner Klasse:
VB.NET-Quellcode
- Public Class myClass
- Private zurzeit As Integer
- Private gesamt As Integer
- Private _list As New List(Of String)
- Private _thread As Threading,Thread
- Public Sub New()
- For i As Integer = 1 to 20
- _list.Add("blubb" & i) 'zu Testzwecken, die Einträge werden später vom Benutzer selbst hinzugefügt...
- Next
- zurzeit = 0
- gesamt = _list.Count()
- End Sub
- Public Sub Start(anzahl As Integer)
- If _thread IsNot Nothing Then
- If _thread.IsAlive Then
- [Stop]
- End If
- End If
- For i As Integer = 0 To anzahl -1
- _thread = New Threading.Thread(AddressOf _doWork)
- _thread.IsBackground = True
- _thread.Start()
- Next
- End Sub
- Public Sub [Stop]()
- If _thread IsNot Nothing Then
- _thread.Abort()
- _thread = Nothing
- End If
- End Sub
- Private Sub _doWork 'hier ist mein eigentliches Problem
- If zurzeit < gesamt Then
- 'hier ist dann die eigentliche Aufgabe:
- _list(zurzeit)...'abgekürzt
- 'Ende der Aufgabe. Ist hier in diesem Beispiel jedoch abgekürzt, im Original wird natürlich noch etwas damit gemacht...
- zurzeit += 1
- If zurzeit = gesamt Then
- [Stop]()
- MsgBox("Fertig!") 'das hier soll nur angezeigt werden, wenn wirklich alle _doWork-Threads fertig sind, und mit allen _list-Einträgen gearbeitet wurde
- Else
- _doWork() 'Wenn nocht nicht mit allen Einträgen aus _list gearbeitet wurde, erneut aufrufen
- End If
- End If
- End Sub
- End Class
Ich würde es gerne so haben, dass man "Start" aufruft, und angeben kann, wie oft nun die Aufgabe gleichzeitig gemacht werden soll. Wenn ich also .Start(3) aufrufe, wird ja _doWork() 3x aufgerufen und jedesmal wird "zurzeit" um 1 erhöht. Wenn die Aufgabe also erledigt wurde, und "zurzeit" noch nicht "gesamt" erreicht hat, soll _doWork() erneut aufgerufen werden. Somit müsste ja nun _doWork() die ganze Zeit 3x gleichzeitig laufen, mit dem Unterschied, dass das nächste Item aus "_list" genommen wird.
Das Problem ist nun aber, dass am Ende auch 3x die MsgBox angezeigt wird und ich komm nicht drauf, wie ich das ändern muss, damit sie wirklich nur einmal aufpoppt, und zwar wenn alle Aufgaben erledigt wurden.
Achja, ein weiteres Problem ist, das immer mal wieder am Anfang die zwei selben Einträge aus _list genommen werden..also:
Woran könnte das liegen? Ist auch nur manchmal so..
Hoffe jemand hat das so in etwa verstanden..