''' <summary>
''' Hauptaufgabe
''' </summary>
''' <remarks>Hier werden entsprechend den Vorgaben die gewünschte
' Anzahl an parallelen Threads erstellt.
''' Diese rufen dann jeweils die zu überschreibende Routiene DoWork()
' auf.</remarks>
Protected Overrides Sub DoTask()
'in Schleife Tasks einfüttern...
Do
'Wait Handle für Pause:
If Not mPauseWaitHandle.WaitOne(0, False) Then
If mDebugMode Then Debug.WriteLine(mThreadName & "::" & _
"Haupthread wurde angehalten!")
End If
mPauseWaitHandle.WaitOne()
If mRequestStop Then Exit Do
If mInputList.Count > 0 Then
'weitere Elemente vorhanden. Max Anz testen...
Dim bBreak As Boolean = False
SyncLock mSingleThreads
If mSingleThreads.Count < mAnzTasks Then
'neuer Task möglich...
Dim Task As New SingleTaskProcessor(Me, _
mInputList.Dequeue(), mIsBackground, Nothing)
mSingleThreads.Add(Task)
mSingleThreads(mSingleThreads.Count - 1).Start()
Else
'Warten, bis nächster SingleTask fertig ist...
bBreak = True
End If
End SyncLock
If bBreak Then mInputListeWaitHandle.WaitOne()
Else
'KeineElemente (mehr)
If mListClose Then Exit Do
'Verarbeitung aufschieben?
If mInputListWaitTimeout > 0 Then
If mDebugMode Then Debug.WriteLine(mThreadName & "::" & _
"InputListe " & mInputListWaitTimeout.ToString & "ms" & _
"aufschieben...")
System.Threading.Thread.Sleep(mInputListWaitTimeout)
End If
'Fortfahren blockieren, bis neue Elemente vorhanden sind...
mInputListeWaitHandle.Reset()
End If
Loop Until mRequestStop
'Warten, bis alle SingleThreads fertig...
Dim Anz As Integer
Do
mInputListeWaitHandle.WaitOne()
SyncLock Me
Anz = mSingleThreads.Count
End SyncLock
Loop Until Anz = 0
End Sub
''' <summary>
''' Einzelner SingleThread ist abgeschlossen
''' </summary>
''' <param name="Sender"></param>
''' <param name="Obj"></param>
''' <remarks></remarks>
Protected Overridable Sub m_SingleTaskCompleted(ByVal Sender As _
SingleTaskProcessor, ByVal Obj As T)
If mDebugMode Then Debug.WriteLine(mThreadName & "::" & _
"SingleTaskCompleted " & Obj.ToString)
Dim e As New MTP_ThreadEventArgs(Obj, Sender, False)
'Element aus Zwischenliste entfernen...
SyncLock mSingleThreads
If mSingleThreads.Contains(Sender) Then mSingleThreads.Remove( _
Sender)
End SyncLock
If mUseOutputList Then
'Obj in Ergebnisliste einfügen...
mOutputList.Enqueue(Obj)
'TODO: OutputListe erwecken!
'mOutputListeWaitHandle.Set()
Else
'Fertigstellung mittels Invoke() direkt signalisieren...
OnEvent(Me, CType(e, EventArgs), SingleTaskCompletedEvent)
End If
If e.Cancel Then
'Abbruch gewünscht
Me.RequestStop()
Else
'neuer SingleThread-Liste ist freigeworden. Neuer Thread kann
' jetzt erstellt werden.
mInputListeWaitHandle.Set()
End If
End Sub
''' <summary>
''' Einzelner SingleThread ist gestarted worden
''' </summary>
''' <param name="Sender"></param>
''' <param name="Obj"></param>
''' <param name="Cancel"></param>
''' <remarks>vorzeitiger Abbruch noch möglich</remarks>
Protected Overridable Sub m_SingleTaskStart(ByVal Sender As _
SingleTaskProcessor, ByVal Obj As T, ByRef Cancel As Boolean)
If mDebugMode Then Debug.WriteLine(mThreadName & "::" & _
"SingleTaskStart: " & Obj.ToString)
'Fertigstellung signalisieren...
Dim e As New MTP_ThreadEventArgs(Obj, Sender, False)
OnEvent(Me, CType(e, EventArgs), SingleTaskStartedEvent)
If e.Cancel Then Me.RequestStop()
End Sub |