Imports System.ComponentModel
Imports System.Drawing
Public Class Form1
' 23-12-2010 First Release
' 28-12-2010 Added sub init
Public x(10, 10), y(10, 10), z(10, 10)
Public itercnt(5), seccnt(5) As Integer
Public npreq, np As Integer
Public state(5) As Integer
Public loadreq, loadd As Integer ' Name Load cannot be used !
Const StartSt As Integer = 1, StopSt As Integer = 0, CancelSt As Integer = 3, Endst = 0
Public Sub New()
InitializeComponent()
InitForm()
BackgroundWorkerpp1.WorkerReportsProgress = True
BackgroundWorkerpp1.WorkerSupportsCancellation = True
BackgroundWorkerpp2.WorkerReportsProgress = True
BackgroundWorkerpp2.WorkerSupportsCancellation = True
BackgroundWorkerpp3.WorkerReportsProgress = True
BackgroundWorkerpp3.WorkerSupportsCancellation = True
BackgroundWorkerpp4.WorkerReportsProgress = True
BackgroundWorkerpp4.WorkerSupportsCancellation = True
BackgroundWorkerpp5.WorkerReportsProgress = True
BackgroundWorkerpp5.WorkerSupportsCancellation = True
ResultLabelpp1.Text = " "
ResultLabelpp2.Text = " "
ResultLabelpp3.Text = " "
ResultLabelpp4.Text = " "
ResultLabelpp5.Text = " "
End Sub
Private Sub startAsyncButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartAsyncButton.Click
Dim a As String
If BackgroundWorkerpp1.IsBusy <> True Then
' Start the asynchronous operation.
BackgroundWorkerpp1.RunWorkerAsync()
npreq = 1
ProcTpp1.Text = 1
Else
If BackgroundWorkerpp2.IsBusy <> True Then
' Start the asynchronous operation.
BackgroundWorkerpp2.RunWorkerAsync()
npreq = 2
ProcTpp2.Text = 2
Else
If BackgroundWorkerpp3.IsBusy <> True Then
' Start the asynchronous operation.
BackgroundWorkerpp3.RunWorkerAsync()
npreq = 3
ProcTpp3.Text = 3
Else
If BackgroundWorkerpp4.IsBusy <> True Then
' Start the asynchronous operation.
BackgroundWorkerpp4.RunWorkerAsync()
npreq = 4
ProcTpp4.Text = 4
Else
If BackgroundWorkerpp5.IsBusy <> True Then
' Start the asynchronous operation.
BackgroundWorkerpp5.RunWorkerAsync()
npreq = 5
ProcTpp5.Text = 5
End If
End If
End If
End If
End If
NProcT.Text = npreq
a = loadT.Text : loadreq = Val(a)
If loadreq = 0 Then loadreq = 1
End Sub
Private Sub cancelAsyncButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CancelAsyncButton.Click
Dim a As String
If npreq = 0 Then Exit Sub
' Update control panel
If npreq = 1 Then
ProcTpp1.Text = " "
Else
If npreq = 2 Then
ProcTpp2.Text = " "
Else
If npreq = 3 Then
ProcTpp3.Text = " "
Else
If npreq = 4 Then
ProcTpp4.Text = " "
Else
ProcTpp5.Text = " "
End If
End If
End If
End If
npreq = npreq - 1
NProcT.Text = npreq
a = loadT.Text : loadreq = Val(a)
If loadreq = 0 Then loadreq = 1
End Sub
Private Sub EndSyncButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EndAsyncButton.Click
If npreq > 0 Then
Debug.Print("Click End" + Str(npreq))
npreq = -1 ' npreq end state
Else
End
End If
End Sub
Private Sub MonitorButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MonitorButton.Click
StateTpp1.Text = state(1)
StateTpp2.Text = state(2)
StateTpp3.Text = state(3)
StateTpp4.Text = state(4)
StateTpp5.Text = state(5)
End Sub
' This event handler 1 is where the time-consuming work is done.
Private Sub backgroundWorker1_DoWork(ByVal sender As System.Object, _
ByVal e As DoWorkEventArgs) Handles BackgroundWorkerpp1.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
Dim i, j, pstr, ip As Integer
Dim sec1, sec2 As Integer
Dim a As String
sec1 = Second(Now)
pstr = 0 ' Processor start = 1-1
a = loadT.Text : loadreq = Val(a) ' Load loop counter
If loadreq = 0 Then loadreq = 1
Debug.Print("PP1 Load " + Str(loadreq))
Init()
Do
itercnt(1) = itercnt(1) + 1
If np <> npreq Then
If npreq = -1 Then ' end state
If np > 0 Then
state(np) = CancelSt
np = np - 1
Else
npreq = 0
End
End If
Else
If npreq < np Then
state(np) = CancelSt
End If
np = npreq ' make local - Only P1
End If
For i = 0 To 5
itercnt(i) = -1 : seccnt(i) = -1
Next
loadd = loadreq
End If
If np > 1 Then state(2) = StartSt ' Start P1
If np > 2 Then state(3) = StartSt ' start p2
If np > 3 Then state(4) = StartSt ' Start P3
If np > 4 Then state(5) = StartSt ' Start P3
If np > 0 Then
For ip = 1 To loadd
For i = pstr To 10 Step np
For j = 0 To 10
x(i, j) = y(i, j) + z(i, j)
Next
Next
Next ip
End If
If np > 1 Then
Do
Loop Until state(2) = StopSt
End If
If np > 2 Then
Do
Loop Until state(3) = StopSt
End If
If np > 3 Then
Do
Loop Until state(4) = StopSt
End If
If np > 4 Then
Do
Loop Until state(5) = StopSt
End If
''If (worker.CancellationPending = True) Or state(1) = CancelSt Then
If state(1) = CancelSt Then
e.Cancel = True
state(1) = Endst
Debug.Print("PP1 Cancelst " + Str(state(1)))
Exit Sub
Else
' Perform a time consuming operation and report progress.
sec2 = Second(Now)
If sec2 <> sec1 Then
System.Threading.Thread.Sleep(1)
sec1 = Second(Now)
seccnt(1) = seccnt(1) + 1
If seccnt(1) <= 0 Then
itercnt(1) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(1) / seccnt(1))
End If
'cnt = 0
End If
End If
Loop
End Sub
' This event handler 1 updates the progress.
Private Sub backgroundWorkerpp1_ProgressChanged(ByVal sender As System.Object, _
ByVal e As ProgressChangedEventArgs) Handles BackgroundWorkerpp1.ProgressChanged
ResultLabelpp1.Text = (e.ProgressPercentage.ToString())
seccntT.Text = Str(seccnt(1))
End Sub
' This event handler 1 deals with the results of the background operation.
Private Sub backgroundWorkerpp1_RunWorkerCompleted(ByVal sender As System.Object, _
ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorkerpp1.RunWorkerCompleted
If e.Cancelled = True Then
ResultLabelpp1.Text = "Canceled!"
ElseIf e.Error IsNot Nothing Then
ResultLabelpp1.Text = "Error: " & e.Error.Message
Else
ResultLabelpp1.Text = "Done!"
End If
End Sub
' This event handler 2 is where the time-consuming work is done.
Private Sub backgroundWorkerpp2_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorkerpp2.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
Dim i, j, pstr, ip As Integer
Dim sec1, sec2 As Integer
sec1 = Second(Now)
pstr = 1
Debug.Print("PP2 Load " + Str(2))
Do
itercnt(2) = itercnt(2) + 1
If state(2) = StartSt Then
For ip = 1 To loadd
For i = pstr To 10 Step np
For j = 0 To 10
x(i, j) = y(i, j) + z(i, j)
Next
Next
Next ip
state(2) = StopSt
End If
' If (worker.CancellationPending = True) Or state(2) = CancelSt Then
If state(2) = CancelSt Then
e.Cancel = True
state(2) = Endst
Debug.Print("PP2 Cancelst " + Str(state(2)))
Exit Sub
Else
sec2 = Second(Now)
If sec2 <> sec1 Then
System.Threading.Thread.Sleep(1)
sec1 = Second(Now)
seccnt(2) = seccnt(2) + 1
If seccnt(2) <= 0 Then
itercnt(2) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(2) / seccnt(2))
End If
End If
End If
Loop
End Sub
' This event handler 2 updates the progress.
Private Sub backgroundWorkerpp2_ProgressChanged(ByVal sender As System.Object, _
ByVal e As ProgressChangedEventArgs) Handles BackgroundWorkerpp2.ProgressChanged
ResultLabelpp2.Text = (e.ProgressPercentage.ToString())
End Sub
' This event handler 2 deals with the results of the background operation.
Private Sub backgroundWorkerpp2_RunWorkerCompleted(ByVal sender As System.Object, _
ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorkerpp2.RunWorkerCompleted
If e.Cancelled = True Then
ResultLabelpp2.Text = "Canceled!"
ElseIf e.Error IsNot Nothing Then
ResultLabelpp2.Text = "Error: " & e.Error.Message
Else
ResultLabelpp2.Text = "Done!"
End If
End Sub
' This event handler 3 is where the time-consuming work is done.
Private Sub backgroundWorkerpp3_DoWork(ByVal sender As System.Object, _
ByVal e As DoWorkEventArgs) Handles BackgroundWorkerpp3.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
Dim i, j, pstr As Integer
Dim sec1, sec2 As Integer
sec1 = Second(Now)
pstr = 2
Debug.Print("PP3 Load " + Str(3))
Do
itercnt(3) = itercnt(3) + 1
If state(3) = StartSt Then
For ip = 1 To loadd
For i = pstr To 10 Step np
For j = 0 To 10
x(i, j) = y(i, j) + z(i, j)
Next
Next
Next
state(3) = StopSt
End If
If state(3) = CancelSt Then
e.Cancel = True
state(3) = Endst
Debug.Print("PP3 Cancelst " + Str(state(3)))
Exit Sub
Else
sec2 = Second(Now)
If sec2 <> sec1 Then
System.Threading.Thread.Sleep(1)
sec1 = Second(Now)
seccnt(3) = seccnt(3) + 1
If seccnt(3) <= 0 Then
itercnt(3) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(3) / seccnt(3))
End If
End If
End If
Loop
End Sub
' This event handler 3 updates the progress.
Private Sub backgroundWorkerpp3_ProgressChanged(ByVal sender As System.Object, _
ByVal e As ProgressChangedEventArgs) Handles BackgroundWorkerpp3.ProgressChanged
ResultLabelpp3.Text = (e.ProgressPercentage.ToString())
End Sub
' This event handler 3 deals with the results of the background operation.
Private Sub backgroundWorkerpp3_RunWorkerCompleted(ByVal sender As System.Object, _
ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorkerpp3.RunWorkerCompleted
If e.Cancelled = True Then
ResultLabelpp3.Text = "Canceled!"
ElseIf e.Error IsNot Nothing Then
ResultLabelpp3.Text = "Error: " & e.Error.Message
Else
ResultLabelpp3.Text = "Done!"
End If
End Sub
' This event handler 4 is where the time-consuming work is done.
Private Sub backgroundWorkerpp4_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorkerpp4.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
Dim i, j, pstr As Integer
Dim sec1, sec2 As Integer
sec1 = Second(Now)
pstr = 3
Do
itercnt(4) = itercnt(4) + 1
If state(4) = StartSt Then
For ip = 1 To loadd
For i = pstr To 10 Step np
For j = 0 To 10
x(i, j) = y(i, j) + z(i, j)
Next
Next
Next
state(4) = StopSt
End If
'If (worker.CancellationPending = True) Or state(4) = CancelSt Then
If state(4) = CancelSt Then
e.Cancel = True
state(4) = Endst
Debug.Print("PP4 Cancelst " + Str(state(4)))
Exit Sub
Else
sec2 = Second(Now)
If sec2 <> sec1 Then
System.Threading.Thread.Sleep(1)
sec1 = Second(Now)
seccnt(4) = seccnt(4) + 1
If seccnt(4) <= 0 Then
itercnt(4) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(4) / seccnt(4))
End If
End If
End If
Loop
End Sub
' This event handler 4 updates the progress.
Private Sub backgroundWorkerpp4_ProgressChanged(ByVal sender As System.Object, _
ByVal e As ProgressChangedEventArgs) Handles BackgroundWorkerpp4.ProgressChanged
ResultLabelpp4.Text = (e.ProgressPercentage.ToString())
End Sub
' This event handler 4 deals with the results of the background operation.
Private Sub backgroundWorkerpp4_RunWorkerCompleted(ByVal sender As System.Object, _
ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorkerpp4.RunWorkerCompleted
If e.Cancelled = True Then
ResultLabelpp4.Text = "Canceled!"
ElseIf e.Error IsNot Nothing Then
ResultLabelpp4.Text = "Error: " & e.Error.Message
Else
ResultLabelpp4.Text = "Done!"
End If
End Sub
' This event handler 5 is where the time-consuming work is done.
Private Sub backgroundWorkerpp5_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorkerpp5.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
Dim i, j, pstr As Integer
Dim sec1, sec2 As Integer
sec1 = Second(Now)
pstr = 4
Do
itercnt(5) = itercnt(5) + 1
If state(5) = StartSt Then
For ip = 1 To loadd
For i = pstr To 10 Step np
For j = 0 To 10
x(i, j) = y(i, j) + z(i, j)
Next
Next
Next
state(5) = StopSt
End If
'If (worker.CancellationPending = True) Or state(4) = CancelSt Then
If state(5) = CancelSt Then
e.Cancel = True
state(5) = Endst
Debug.Print("pp5 Cancelst " + Str(state(5)))
Exit Sub
Else
sec2 = Second(Now)
If sec2 <> sec1 Then
System.Threading.Thread.Sleep(1)
sec1 = Second(Now)
seccnt(5) = seccnt(5) + 1
If seccnt(5) <= 0 Then
itercnt(5) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(5) / seccnt(5))
End If
End If
End If
Loop
End Sub
' This event handler 5 updates the progress.
Private Sub backgroundWorkerpp5_ProgressChanged(ByVal sender As System.Object, _
ByVal e As ProgressChangedEventArgs) Handles BackgroundWorkerpp5.ProgressChanged
ResultLabelpp5.Text = (e.ProgressPercentage.ToString())
End Sub
' This event handler 5 deals with the results of the background operation.
Private Sub backgroundWorkerpp5_RunWorkerCompleted(ByVal sender As System.Object, _
ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorkerpp5.RunWorkerCompleted
If e.Cancelled = True Then
ResultLabelpp5.Text = "Canceled!"
ElseIf e.Error IsNot Nothing Then
ResultLabelpp5.Text = "Error: " & e.Error.Message
Else
ResultLabelpp5.Text = "Done!"
End If
End Sub
Sub Init()
For i = 0 To 10
For j = 0 To 10
y(i, j) = (i + 1) / (j + 1)
z(i, j) = 3.14 / y(i, j)
Next
Next
End Sub
Sub InitForm()
Dim hh, dhh As Integer
Dim dd, ddd As Integer
'
'Row 1
'
hh = 12 : dhh = 34
Me.StateL.Location = New System.Drawing.Point(3, hh)
Me.StateL.Size = New System.Drawing.Size(32, 13)
dd = 60 : ddd = 70
Me.StateTpp1.Location = New System.Drawing.Point(dd, hh)
Me.StateTpp1.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.StateTpp2.Location = New System.Drawing.Point(dd, hh)
Me.StateTpp2.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.StateTpp3.Location = New System.Drawing.Point(dd, hh)
Me.StateTpp3.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.StateTpp4.Location = New System.Drawing.Point(dd, hh)
Me.StateTpp4.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.StateTpp5.Location = New System.Drawing.Point(dd, hh)
Me.StateTpp5.Size = New System.Drawing.Size(64, 20)
'
'Row 2
'
hh = hh + dhh
Me.ProcL.Location = New System.Drawing.Point(3, hh)
Me.ProcL.Size = New System.Drawing.Size(39, 13)
dd = 60
Me.ProcTpp1.Location = New System.Drawing.Point(dd, hh)
Me.ProcTpp1.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.ProcTpp2.Location = New System.Drawing.Point(dd, hh)
Me.ProcTpp2.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.ProcTpp3.Location = New System.Drawing.Point(dd, hh)
Me.ProcTpp3.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.ProcTpp4.Location = New System.Drawing.Point(dd, hh)
Me.ProcTpp4.Size = New System.Drawing.Size(64, 20)
dd = dd + ddd
Me.ProcTpp5.Location = New System.Drawing.Point(dd, hh)
Me.ProcTpp5.Size = New System.Drawing.Size(64, 20)
'
'Row 3
'
hh = hh + dhh
Me.Label2.Location = New System.Drawing.Point(3, hh)
Me.Label2.Size = New System.Drawing.Size(67, 13)
dd = 85
Me.ResultLabelpp1.Location = New System.Drawing.Point(dd, hh)
Me.ResultLabelpp1.Size = New System.Drawing.Size(70, 13)
dd = dd + ddd
Me.ResultLabelpp2.Location = New System.Drawing.Point(dd, hh)
Me.ResultLabelpp2.Size = New System.Drawing.Size(70, 13)
dd = dd + ddd
Me.ResultLabelpp3.Location = New System.Drawing.Point(dd, hh)
Me.ResultLabelpp3.Size = New System.Drawing.Size(70, 13)
dd = dd + ddd
Me.ResultLabelpp4.Location = New System.Drawing.Point(dd, hh)
Me.ResultLabelpp4.Size = New System.Drawing.Size(70, 13)
dd = dd + ddd
Me.ResultLabelpp5.Location = New System.Drawing.Point(dd, hh)
Me.ResultLabelpp5.Size = New System.Drawing.Size(70, 13)
'
'Row 4
'
dd = 80 : ddd = 90
hh = hh + dhh
Me.nProcL.Location = New System.Drawing.Point(dd - 40, hh)
Me.nProcL.Size = New System.Drawing.Size(55, 13)
Me.NProcT.Location = New System.Drawing.Point(dd, hh)
Me.NProcT.Size = New System.Drawing.Size(40, 20)
dd = dd + ddd
Me.LoadL.Location = New System.Drawing.Point(dd - 40, hh)
Me.LoadL.Size = New System.Drawing.Size(55, 13)
Me.loadT.Location = New System.Drawing.Point(dd, hh)
Me.loadT.Size = New System.Drawing.Size(40, 20)
dd = dd + ddd
Me.seccntL.Location = New System.Drawing.Point(dd - 40, hh)
Me.seccntL.Size = New System.Drawing.Size(55, 13)
Me.seccntT.Location = New System.Drawing.Point(dd, hh)
Me.seccntT.Size = New System.Drawing.Size(40, 20)
'
' row 5 startAsyncButton cancelAsyncButton endAsyncButton MonitorButton
'
dd = 60
hh = hh + dhh
Me.StartAsyncButton.Location = New System.Drawing.Point(dd, hh)
Me.StartAsyncButton.Size = New System.Drawing.Size(63, 25)
dd = dd + ddd
Me.CancelAsyncButton.Location = New System.Drawing.Point(dd, hh)
Me.CancelAsyncButton.Size = New System.Drawing.Size(63, 25)
dd = dd + ddd
Me.EndAsyncButton.Location = New System.Drawing.Point(dd, hh)
Me.EndAsyncButton.Size = New System.Drawing.Size(63, 25)
dd = dd + ddd
Me.MonitorButton.Location = New System.Drawing.Point(dd, hh)
Me.MonitorButton.Size = New System.Drawing.Size(63, 25)
' Form1
dd = dd + ddd : hh = hh + dhh
Me.ClientSize = New System.Drawing.Size(dd - 10, hh)
End Sub
End Class