From bf73f0b257d11b76bbbb26fdbfee5f514ce770d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=93=E3=81=AE=E4=B8=AD=E4=BA=8C=E7=97=85=E3=81=AB?= =?UTF-8?q?=E7=88=86=E7=84=94=E3=82=92=EF=BC=81?= Date: Fri, 15 Jan 2021 11:19:33 +0800 Subject: [PATCH] thread parallel --- Parallel/{ => IpcParallel}/IDelegate.vb | 0 Parallel/{ => IpcParallel}/IPCSocket.vb | 0 Parallel/{ => IpcParallel}/ObjectStream.vb | 0 Parallel/{ => IpcParallel}/Protocols.vb | 0 Parallel/{ => IpcParallel}/SlaveTask.vb | 0 Parallel/{ => IpcParallel}/StreamMethods.vb | 0 Parallel/{ => IpcParallel}/TaskBuilder.vb | 0 Parallel/ThreadTask/ThreadTask.vb | 63 +++++++++++++++++++++ 8 files changed, 63 insertions(+) rename Parallel/{ => IpcParallel}/IDelegate.vb (100%) rename Parallel/{ => IpcParallel}/IPCSocket.vb (100%) rename Parallel/{ => IpcParallel}/ObjectStream.vb (100%) rename Parallel/{ => IpcParallel}/Protocols.vb (100%) rename Parallel/{ => IpcParallel}/SlaveTask.vb (100%) rename Parallel/{ => IpcParallel}/StreamMethods.vb (100%) rename Parallel/{ => IpcParallel}/TaskBuilder.vb (100%) create mode 100644 Parallel/ThreadTask/ThreadTask.vb 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