diff --git a/Parallel/IDelegate.vb b/Parallel/IpcParallel/IDelegate.vb similarity index 100% rename from Parallel/IDelegate.vb rename to Parallel/IpcParallel/IDelegate.vb diff --git a/Parallel/IPCSocket.vb b/Parallel/IpcParallel/IPCSocket.vb similarity index 100% rename from Parallel/IPCSocket.vb rename to Parallel/IpcParallel/IPCSocket.vb diff --git a/Parallel/ObjectStream.vb b/Parallel/IpcParallel/ObjectStream.vb similarity index 100% rename from Parallel/ObjectStream.vb rename to Parallel/IpcParallel/ObjectStream.vb diff --git a/Parallel/Protocols.vb b/Parallel/IpcParallel/Protocols.vb similarity index 100% rename from Parallel/Protocols.vb rename to Parallel/IpcParallel/Protocols.vb diff --git a/Parallel/SlaveTask.vb b/Parallel/IpcParallel/SlaveTask.vb similarity index 100% rename from Parallel/SlaveTask.vb rename to Parallel/IpcParallel/SlaveTask.vb diff --git a/Parallel/StreamMethods.vb b/Parallel/IpcParallel/StreamMethods.vb similarity index 100% rename from Parallel/StreamMethods.vb rename to Parallel/IpcParallel/StreamMethods.vb diff --git a/Parallel/TaskBuilder.vb b/Parallel/IpcParallel/TaskBuilder.vb similarity index 100% rename from Parallel/TaskBuilder.vb rename to Parallel/IpcParallel/TaskBuilder.vb diff --git a/Parallel/ThreadTask/ThreadTask.vb b/Parallel/ThreadTask/ThreadTask.vb new file mode 100644 index 0000000..f436b9e --- /dev/null +++ b/Parallel/ThreadTask/ThreadTask.vb @@ -0,0 +1,63 @@ +Imports Microsoft.VisualBasic.Parallel.Tasks + +Public Class ThreadTask(Of TOut) + + Dim taskList As Queue(Of Func(Of TOut)) + Dim threads As AsyncHandle(Of TOut)() + + Sub New(task As IEnumerable(Of Func(Of TOut))) + Me.taskList = New Queue(Of Func(Of TOut))(task) + End Sub + + Public Function WithDegreeOfParallelism(n_threads As Integer) As ThreadTask(Of TOut) + threads = New AsyncHandle(Of TOut)(n_threads) {} + Return Me + End Function + + Private Function GetEmptyThread() As Integer + For i As Integer = 0 To threads.Length - 1 + If threads(i) Is Nothing Then + Return i + End If + Next + + Return -1 + End Function + + Private Function GetCompleteThread() As Integer + For i As Integer = 0 To threads.Length - 1 + If (Not threads(i) Is Nothing) AndAlso threads(i).IsCompleted Then + Return i + End If + Next + + Return -1 + End Function + + Public Iterator Function RunParallel() As IEnumerable(Of TOut) + Do While taskList.Count > 0 + Dim i As Integer = GetEmptyThread() + + If i > -1 Then + threads(i) = New AsyncHandle(Of TOut)(taskList.Dequeue).Run + End If + + Dim j As Integer = GetCompleteThread() + + If j > -1 Then + Yield threads(j).GetValue + threads(j) = Nothing + End If + Loop + + Do While Not threads.All(Function(t) t Is Nothing) + Dim j As Integer = GetCompleteThread() + + If j > -1 Then + Yield threads(j).GetValue + threads(j) = Nothing + End If + Loop + End Function + +End Class