Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing
Imports System.Threading
Imports System.Windows.Forms
Imports System.Math
Public Class PlanetForm
Inherits System.Windows.Forms.Form
Private hh, dhh, dd, ddd As Integer
Public x(idim), y(idim), z(idim)
Public vx(idim), vy(idim), vz(idim)
Public ax(idim), ay(idim), az(idim)
Public Rev(idim) As Integer ' revolution counter
Public pl_itercnt(idim) As Integer ' cycle counter per planet
Public m(idim)
Public itercnt(5), seccnt(5)
Public npreq, np, nplanets, nplanetsl, holdreq, holdrev, cancelreq, errorc As Integer
Public state(5) As Integer
Const StartSt As Integer = 1, ActiveSt As Integer = 2, StopSt As Integer = 0, CancelSt As Integer = 3, Endst = 0
Const StartSt1 As Integer = 4, Holdst As Integer = 5
Const idim As Integer = 100
Public dt, dtl As Single ' delta t
Const Trace As Integer = 0
Const npmax As Integer = 5
Public Sub New()
InitializeComponent()
InitializeForm()
End Sub 'New
Private Sub StartAsyncButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartAsyncButton.Click
cancelreq = 0
ResultLabelpp1.Text = " "
ResultLabelpp2.Text = " "
ResultLabelpp3.Text = " "
ResultLabelpp4.Text = " "
ResultLabelpp5.Text = " "
StartAsyncButton.Enabled = False
CancelAsyncButton.Enabled = True
CancelAsyncButton.Text = "Stop"
holdrev = HoldT.Value
tdeltaT.Enabled = False
nplT.Enabled = False
HoldT.Enabled = False
np = 0
npreq = nProcT.Value
Assign(npreq)
End Sub
Private Sub CancelAsyncButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CancelAsyncButton.Click
If CancelAsyncButton.Text = "Stop" Then
holdreq = 2
' See Display
Exit Sub
Else
Test()
If errorc > 0 Then
StateTpp1.Text = pl_itercnt(0)
StateTpp2.Text = pl_itercnt(1)
StateTpp3.Text = pl_itercnt(2)
StateTpp4.Text = pl_itercnt(3)
StateTpp5.Text = pl_itercnt(4)
End If
CancelAsyncButton.Text = "Stop"
EndAsyncButton.Enabled = True
holdreq = 0
holdrev = HoldT.Value
If holdrev = Rev(1) Then holdrev = -1
HoldT.Enabled = False
For i = 0 To npmax
itercnt(i) = 0 : seccnt(i) = -2
Next
End If
End Sub
Private Sub EndSyncButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EndAsyncButton.Click
If np <> 0 Then
StartAsyncButton.Enabled = True
CancelAsyncButton.Enabled = False
tdeltaT.Enabled = True
nplT.Enabled = True
HoldT.Enabled = True
cancelreq = 1 'Display
holdreq = 0
Else
Debug.Print("Click End - no Error")
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
Private Sub nProcT_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles nProcT.Click
Dim npreqt As Integer
If npreq > 0 Then
npreqt = nProcT.Value
If npreqt > np Then Assign(npreqt)
If npreq < np Then
For i = 1 To npmax
If npreq < i And np >= i Then
Select Case i
Case Is = 1
Case Is = 2
ProcTpp2.Text = " "
Case Is = 3
ProcTpp3.Text = " "
Case Is = 4
ProcTpp4.Text = " "
Case Is = 5
ProcTpp5.Text = " "
End Select
End If
Next i
End If
npreq = npreqt
End If
End Sub 'Main
' 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 As Integer
Dim sec1, sec2 As Integer
Dim dx, dy, dz, r2, r, a, ynew As Double
Dim b As String
Const pp As Integer = 1
sec1 = Second(Now)
pstr = pp - 1 ' Processor start = 1-1
holdrev = HoldT.Value
holdreq = 0
b = tdeltaT.Text : dt = Val(b) ' Delta t
If dt = 0 Then dt = 0.02 : dtl = 0
b = nplT.Value : nplanets = Val(b)
If nplanets < 1 Then nplanets = 1
If nplanets > idim Then nplanets = idim
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Load dt = " + Str(dt) + " nplanets" + Str(nplanets) + " " + tdeltaT.Text)
Init()
Do
' If pl_itercnt(0) Mod 10000 = 0 Then Debug.Print(Str(pl_itercnt(0)) + " x" + Str(x(1)) + Str(y(1)) + " v" + Str(vx(1)) + Str(vy(1)) + " a" + Str(ax(1)) + Str(ay(1)) + Str(az(1)))
If cancelreq = 1 Then npreq = 0
If npreq <> np Then
If Trace = 1 Then Debug.Print("npreq" + Str(npreq) + " np" + Str(np))
If npreq < np Then CancelS(npreq)
For i = 0 To npmax
itercnt(i) = 0
seccnt(i) = -1
Next
np = npreq
End If
If Rev(1) = holdrev Or holdreq = 2 Then
holdrev = -1
holdreq = 1
For i = 1 To npmax
state(i) = Holdst
Next i
worker.ReportProgress(-1)
End If
If state(1) = Holdst Then
If holdreq = 0 Then
For i = 1 To npmax
state(i) = Endst
Next
Else
System.Threading.Thread.Sleep(1)
End If
Else
If state(1) = CancelSt Then
e.Cancel = True
state(1) = Endst
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Cancelst ")
Exit Sub
Else
itercnt(1) = itercnt(1) + 1
GoTo skip1
' Do not remove this statement !!!
End
skip1:
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 i = pstr To nplanets Step np
ax(i) = 0 : ay(i) = 0 : az(i) = 0
For j = 0 To nplanets
If i <> j Then
dx = x(i) - x(j) : dy = y(i) - y(j) : dz = z(i) - z(j)
r2 = (dx * dx + dy * dy + dz * dz) : r = Sqrt(r2)
a = m(j) / (r2 * r)
ax(i) = ax(i) + a * dx
ay(i) = ay(i) + a * dy
az(i) = az(i) + a * dz
End If
Next
vx(i) = vx(i) - ax(i) * dt
vy(i) = vy(i) - ay(i) * dt
vz(i) = vz(i) - az(i) * dt
Next
End If
If np > 1 Then
Do
Loop Until state(2) = StopSt And state(3) = StopSt And state(4) = StopSt And state(5) = StopSt
End If
If np > 1 Then state(2) = StartSt1 ' Start P1
If np > 2 Then state(3) = StartSt1 ' start p2
If np > 3 Then state(4) = StartSt1 ' Start P3
If np > 4 Then state(5) = StartSt1 ' Start P3
If np > 0 Then
For i = pstr To nplanets Step np
x(i) = x(i) + vx(i) * dt
ynew = y(i) + vy(i) * dt
If y(i) < 0 And ynew > 0 Then Rev(i) = Rev(i) + 1
y(i) = ynew
z(i) = z(i) + vz(i) * dt
pl_itercnt(i) = pl_itercnt(i) + 1
Next
End If
If np > 1 Then
Do
Loop Until state(2) = StopSt And state(3) = StopSt And state(4) = StopSt And state(5) = StopSt
End If
' Perform a time consuming operation and report progress.
sec2 = Second(Now)
If sec2 <> sec1 Then
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
End If
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
Dim pl As Integer
Dim r As Double
If holdreq = 0 Then
ResultLabelpp1.Text = (e.ProgressPercentage.ToString())
Else
' endAsyncButton.Enabled = False
CancelAsyncButton.Enabled = True
CancelAsyncButton.Text = "Restart"
HoldT.Enabled = True
Test()
If errorc > 0 Then
StateTpp1.Text = pl_itercnt(0)
StateTpp2.Text = pl_itercnt(1)
StateTpp3.Text = pl_itercnt(2)
StateTpp4.Text = pl_itercnt(3)
StateTpp5.Text = pl_itercnt(4)
End If
End If
seccntT.Text = Str(seccnt(1))
pl = Val(pl1T.Text)
If pl < 0 Then pl = 0
x1T.Text = Str(Int(x(pl)))
y1T.Text = Str(Int(y(pl)))
r = Sqrt(x(pl) * x(pl) + y(pl) * y(pl))
r1T.Text = r
rev1T.Text = Str(Rev(pl))
pl = Val(pl2T.Text)
If pl < 0 Then pl = 0
x2T.Text = Str(Int(x(pl)))
y2T.Text = Str(Int(y(pl)))
r = Sqrt(x(pl) * x(pl) + y(pl) * y(pl))
r2T.Text = r
rev2T.Text = Str(Rev(pl))
pl = Val(pl3T.Text)
If pl < 0 Then pl = 0
x3T.Text = Str(Int(x(pl)))
y3T.Text = Str(Int(y(pl)))
r = Sqrt(x(pl) * x(pl) + y(pl) * y(pl))
r3T.Text = r
rev3T.Text = Str(Rev(pl))
pl = Val(pl4T.Text)
If pl < 0 Then pl = 0
x4T.Text = Str(Int(x(pl)))
y4T.Text = Str(Int(y(pl)))
r = Sqrt(x(pl) * x(pl) + y(pl) * y(pl))
r4T.Text = r
rev4T.Text = Str(Rev(pl))
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
If cancelreq = 0 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 As Integer
Dim sec1, sec2 As Integer
Dim dx, dy, dz, r2, r, a, ynew As Double
Const pp As Integer = 2
sec1 = Second(Now)
pstr = pp - 1
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Load")
Do
itercnt(pp) = itercnt(pp) + 1
Select Case state(pp)
Case Is = Holdst
System.Threading.Thread.Sleep(1)
Case Is = CancelSt
e.Cancel = True
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Cancelst " + Str(state(pp)))
state(pp) = Endst
Exit Sub
Case Is = StartSt
state(pp) = ActiveSt
For i = pstr To nplanets Step np
ax(i) = 0 : ay(i) = 0 : az(i) = 0
For j = 0 To nplanets
If i <> j Then
dx = x(i) - x(j) : dy = y(i) - y(j) : dz = z(i) - z(j)
r2 = (dx * dx + dy * dy + dz * dz) : r = Sqrt(r2)
a = m(j) / (r2 * r)
ax(i) = ax(i) - a * dx
ay(i) = ay(i) - a * dy
az(i) = az(i) - a * dz
End If
Next
vx(i) = vx(i) + ax(i) * dt
vy(i) = vy(i) + ay(i) * dt
vz(i) = vz(i) + az(i) * dt
Next
state(pp) = StopSt
Case Is = StartSt1
state(pp) = ActiveSt
For i = pstr To nplanets Step np
x(i) = x(i) + vx(i) * dt
ynew = y(i) + vy(i) * dt
If y(i) < 0 And ynew > 0 Then Rev(i) = Rev(i) + 1
y(i) = ynew
z(i) = z(i) + vz(i) * dt
pl_itercnt(i) = pl_itercnt(i) + 1
Next
state(pp) = StopSt
sec2 = Second(Now)
If sec2 <> sec1 Then
sec1 = Second(Now)
seccnt(pp) = seccnt(pp) + 1
If seccnt(pp) <= 0 Then
itercnt(pp) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(pp) / seccnt(pp))
End If
End If
Case Else
End Select
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
If cancelreq = 0 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
Dim dx, dy, dz, r2, r, a, ynew As Double
Const pp As Integer = 3
sec1 = Second(Now)
pstr = pp - 1
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Load")
Do
itercnt(pp) = itercnt(pp) + 1
Select Case state(pp)
Case Is = Holdst
System.Threading.Thread.Sleep(1)
Case Is = CancelSt
e.Cancel = True
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Cancelst " + Str(state(pp)))
state(pp) = Endst
Exit Sub
Case Is = StartSt
state(pp) = ActiveSt
For i = pstr To nplanets Step np
ax(i) = 0 : ay(i) = 0 : az(i) = 0
For j = 0 To nplanets
If i <> j Then
dx = x(i) - x(j) : dy = y(i) - y(j) : dz = z(i) - z(j)
r2 = (dx * dx + dy * dy + dz * dz) : r = Sqrt(r2)
a = m(j) / (r2 * r)
ax(i) = ax(i) - a * dx
ay(i) = ay(i) - a * dy
az(i) = az(i) - a * dz
End If
Next
vx(i) = vx(i) + ax(i) * dt
vy(i) = vy(i) + ay(i) * dt
vz(i) = vz(i) + az(i) * dt
Next
state(pp) = StopSt
Case Is = StartSt1
state(pp) = ActiveSt
For i = pstr To nplanets Step np
x(i) = x(i) + vx(i) * dt
ynew = y(i) + vy(i) * dt
If y(i) < 0 And ynew > 0 Then Rev(i) = Rev(i) + 1
y(i) = ynew
z(i) = z(i) + vz(i) * dt
pl_itercnt(i) = pl_itercnt(i) + 1
Next
state(pp) = StopSt
sec2 = Second(Now)
If sec2 <> sec1 Then
sec1 = Second(Now)
seccnt(pp) = seccnt(pp) + 1
If seccnt(pp) <= 0 Then
itercnt(pp) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(pp) / seccnt(pp))
End If
End If
End Select
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
If cancelreq = 0 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
Dim dx, dy, dz, r2, r, a, ynew As Double
Const pp As Integer = 4
sec1 = Second(Now)
pstr = pp - 1
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Load")
Do
itercnt(pp) = itercnt(pp) + 1
Select Case state(pp)
Case Is = Holdst
System.Threading.Thread.Sleep(1)
Case Is = CancelSt
e.Cancel = True
state(pp) = Endst
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Cancelst ")
Exit Sub
Case Is = StartSt
state(pp) = ActiveSt
For i = pstr To nplanets Step np
ax(i) = 0 : ay(i) = 0 : az(i) = 0
For j = 0 To nplanets
If i <> j Then
dx = x(i) - x(j) : dy = y(i) - y(j) : dz = z(i) - z(j)
r2 = (dx * dx + dy * dy + dz * dz) : r = Sqrt(r2)
a = m(j) / (r2 * r)
ax(i) = ax(i) - a * dx
ay(i) = ay(i) - a * dy
az(i) = az(i) - a * dz
End If
Next
vx(i) = vx(i) + ax(i) * dt
vy(i) = vy(i) + ay(i) * dt
vz(i) = vz(i) + az(i) * dt
Next
state(pp) = StopSt
Case Is = StartSt1
state(pp) = ActiveSt
For i = pstr To nplanets Step np
x(i) = x(i) + vx(i) * dt
ynew = y(i) + vy(i) * dt
If y(i) < 0 And ynew > 0 Then Rev(i) = Rev(i) + 1
y(i) = ynew
z(i) = z(i) + vz(i) * dt
pl_itercnt(i) = pl_itercnt(i) + 1
Next
state(pp) = StopSt
sec2 = Second(Now)
If sec2 <> sec1 Then
sec1 = Second(Now)
seccnt(pp) = seccnt(pp) + 1
If seccnt(pp) <= 0 Then
itercnt(pp) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(pp) / seccnt(pp))
End If
End If
End Select
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
If cancelreq = 0 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
Dim dx, dy, dz, r2, r, a, ynew As Double
Const pp As Integer = 5
sec1 = Second(Now)
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Load")
pstr = pp - 1
Do
itercnt(pp) = itercnt(pp) + 1
Select Case state(pp)
Case Is = Holdst
System.Threading.Thread.Sleep(1)
Case Is = CancelSt
e.Cancel = True
state(pp) = Endst
If Trace = 1 Then Debug.Print("PP " + Str(pp) + " Cancelst ")
Exit Sub
Case Is = StartSt
state(pp) = ActiveSt
For i = pstr To nplanets Step np
ax(i) = 0 : ay(i) = 0 : az(i) = 0
For j = 0 To nplanets
If i <> j Then
dx = x(i) - x(j) : dy = y(i) - y(j) : dz = z(i) - z(j)
r2 = (dx * dx + dy * dy + dz * dz) : r = Sqrt(r2)
a = m(j) / (r2 * r)
ax(i) = ax(i) - a * dx
ay(i) = ay(i) - a * dy
az(i) = az(i) - a * dz
End If
Next
vx(i) = vx(i) + ax(i) * dt
vy(i) = vy(i) + ay(i) * dt
vz(i) = vz(i) + az(i) * dt
Next
state(pp) = StopSt
Case Is = StartSt1
state(pp) = ActiveSt
For i = pstr To nplanets Step np
x(i) = x(i) + vx(i) * dt
ynew = y(i) + vy(i) * dt
If y(i) < 0 And ynew > 0 Then Rev(i) = Rev(i) + 1
y(i) = ynew
z(i) = z(i) + vz(i) * dt
pl_itercnt(i) = pl_itercnt(i) + 1
Next
state(pp) = StopSt
sec2 = Second(Now)
If sec2 <> sec1 Then
sec1 = Second(Now)
seccnt(pp) = seccnt(pp) + 1
If seccnt(pp) <= 0 Then
itercnt(pp) = 0
worker.ReportProgress(0)
Else
worker.ReportProgress(itercnt(pp) / seccnt(pp))
End If
End If
End Select
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
If cancelreq = 0 Then ResultLabelpp5.Text = "Canceled!"
ElseIf e.Error IsNot Nothing Then
ResultLabelpp5.Text = "Error: " & e.Error.Message
Else
ResultLabelpp5.Text = "Done!"
End If
End Sub
Private Sub Init()
Dim i As Integer
For i = 0 To idim
x(i) = 0 : y(i) = 0 : z(i) = 0
vx(i) = 0 : vy(i) = 0 : vz(i) = 0
ax(i) = 0 : ay(i) = 0 : az(i) = 0
pl_itercnt(i) = 0
Rev(i) = 0 ' Revolution counter
Next
m(0) = 1000
For i = 1 To nplanets
m(i) = 0
x(i) = 1000 + (i - 1) * 100
If x(i) <> 0 Then vy(i) = Sqrt(m(0) / x(i))
Next
Printa(x, Str(pl_itercnt(0)) + " x")
Printa(vy, Str(pl_itercnt(0)) + " vy")
End Sub
Private Sub Test()
Dim a As String
Dim i, j As Integer
For i = 0 To nplanets - 1
If pl_itercnt(i) <> pl_itercnt(i + 1) Then
errorc = 1
End If
Next i
If errorc = 1 Then
a = "Test error "
For j = 0 To nplanets
a = a + Str(j) + " " + Str(pl_itercnt(j)) + " "
Next j
Debug.Print(a)
End If
End Sub
Private Sub Printa(ByVal xp(), ByVal str1)
Dim b As String
Dim j As Integer
b = str1
For j = 0 To nplanets
b = b + Str(j) + " " + Str(xp(j)) + " "
Next j
Debug.Print(b)
End Sub
Private Sub Assign(ByVal npreq)
' npreq = request np = actual
For i = 1 To npmax
If npreq >= i And np < i Then
Select Case i
Case Is = 1
BackgroundWorkerpp1.RunWorkerAsync(i)
If Trace = 1 Then Debug.Print("Assign " + Str(i))
ProcTpp1.Text = 1
Case Is = 2
BackgroundWorkerpp2.RunWorkerAsync(i)
If Trace = 1 Then Debug.Print("Assign " + Str(i))
ProcTpp2.Text = 2
Case Is = 3
BackgroundWorkerpp3.RunWorkerAsync(i)
If Trace = 1 Then Debug.Print("Assign " + Str(i))
ProcTpp3.Text = 3
Case Is = 4
BackgroundWorkerpp4.RunWorkerAsync(i)
If Trace = 1 Then Debug.Print("Assign " + Str(i))
ProcTpp4.Text = 4
Case Is = 5
BackgroundWorkerpp5.RunWorkerAsync(i)
If Trace = 1 Then Debug.Print("Assign " + Str(i))
ProcTpp5.Text = 5
End Select
End If
Next i
End Sub
Private Sub CancelS(ByVal npreq)
' npreq = request np = actual
For i = 1 To npmax
If npreq < i And np >= i Then
Select Case i
Case Is = 1
state(i) = CancelSt
If Trace = 1 Then Debug.Print("Cancel " + Str(i))
Case Is = 2
state(i) = CancelSt
If Trace = 1 Then Debug.Print("Cancel " + Str(i))
Case Is = 3
state(i) = CancelSt
If Trace = 1 Then Debug.Print("Cancel " + Str(i))
Case Is = 4
state(i) = CancelSt
If Trace = 1 Then Debug.Print("Cancel " + Str(i))
Case Is = 5
state(i) = CancelSt
If Trace = 1 Then Debug.Print("Cancel " + Str(i))
End Select
End If
Next
' np = npreq
End Sub
Private Sub InitializeForm()
Dim hh, dhh, dd, ddd As Single
'
'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(60, 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(60, 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 = 20 : ddd = 95
hh = hh + dhh
Me.nProcL.Location = New System.Drawing.Point(dd, hh)
'Me.nProcL.Size = New System.Drawing.Size(55, 13)
dd = dd + nProcL.Width
Me.nProcT.Location = New System.Drawing.Point(dd, hh)
Me.nProcT.Size = New System.Drawing.Size(40, 20)
dd = dd + nProcT.Width
Me.tdeltaL.Location = New System.Drawing.Point(dd, hh)
'Me.tdeltaL.Size = New System.Drawing.Size(55, 13)
dd = dd + tdeltaL.Width
Me.tdeltaT.Location = New System.Drawing.Point(dd, hh)
Me.tdeltaT.Size = New System.Drawing.Size(40, 20)
dd = dd + tdeltaT.Width
Me.seccntL.Location = New System.Drawing.Point(dd, hh)
'Me.seccntL.Size = New System.Drawing.Size(40, 13)
dd = dd + seccntL.Width
Me.seccntT.Location = New System.Drawing.Point(dd, hh)
Me.seccntT.Size = New System.Drawing.Size(40, 20)
dd = dd + seccntT.Width
Me.nplL.Location = New System.Drawing.Point(dd, hh)
'Me.nplL.Size = New System.Drawing.Size(55, 13)
dd = dd + nplL.Width
Me.nplT.Location = New System.Drawing.Point(dd, hh)
Me.nplT.Size = New System.Drawing.Size(40, 20)
dd = dd + nplT.Width
Me.HoldL.Location = New System.Drawing.Point(dd, hh)
Me.HoldL.Size = New System.Drawing.Size(29, 13)
dd = dd + HoldL.Width
Me.HoldT.Location = New System.Drawing.Point(dd, hh)
Me.HoldT.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.Enabled = False
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)
'
'Row 6 Planet x y r rev
'
dd = 80
hh = hh + dhh
Me.Label1.Location = New System.Drawing.Point(6, hh)
Me.Label1.Size = New System.Drawing.Size(40, 13)
Me.Label3.Location = New System.Drawing.Point(dd, hh)
Me.Label3.Size = New System.Drawing.Size(12, 13)
dd = dd + ddd
Me.Label4.Location = New System.Drawing.Point(dd, hh)
Me.Label4.Size = New System.Drawing.Size(15, 13)
dd = dd + ddd
Me.Label5.Location = New System.Drawing.Point(dd, hh)
Me.Label5.Size = New System.Drawing.Size(12, 13)
dd = dd + ddd
Me.Label6.Location = New System.Drawing.Point(dd, hh)
Me.Label6.Size = New System.Drawing.Size(22, 13)
'
'Row 7 Planet 1
'
dhh = 25
hh = hh + dhh 'hh=200
Me.pl1T.Location = New System.Drawing.Point(13, hh)
Me.pl1T.Size = New System.Drawing.Size(21, 20)
dd = 60
Me.x1T.Location = New System.Drawing.Point(dd, hh)
Me.x1T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.y1T.Location = New System.Drawing.Point(dd, hh)
Me.y1T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.r1T.Location = New System.Drawing.Point(dd, hh)
Me.r1T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.rev1T.Location = New System.Drawing.Point(dd, hh)
Me.rev1T.Size = New System.Drawing.Size(61, 20)
'
'Row 8 Planet 2
'
hh = hh + dhh
Me.pl2T.Location = New System.Drawing.Point(13, hh)
Me.pl2T.Size = New System.Drawing.Size(21, 20)
dd = 60
Me.x2T.Location = New System.Drawing.Point(dd, hh)
Me.x2T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.y2T.Location = New System.Drawing.Point(dd, hh)
Me.y2T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.r2T.Location = New System.Drawing.Point(dd, hh)
Me.r2T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.rev2T.Location = New System.Drawing.Point(dd, hh)
Me.rev2T.Size = New System.Drawing.Size(61, 20)
'
'Row 9 Planet 3
'
hh = hh + dhh
Me.pl3T.Location = New System.Drawing.Point(13, hh)
Me.pl3T.Size = New System.Drawing.Size(21, 20)
dd = 60
Me.x3T.Location = New System.Drawing.Point(dd, hh)
Me.x3T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.y3T.Location = New System.Drawing.Point(dd, hh)
Me.y3T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.r3T.Location = New System.Drawing.Point(dd, hh)
Me.r3T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.rev3T.Location = New System.Drawing.Point(dd, hh)
Me.rev3T.Size = New System.Drawing.Size(61, 20)
'
'Row 10 Planet 4
'
hh = hh + dhh
Me.pl4T.Location = New System.Drawing.Point(13, hh)
Me.pl4T.Size = New System.Drawing.Size(21, 20)
dd = 60
Me.x4T.Location = New System.Drawing.Point(dd, hh)
Me.x4T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.y4T.Location = New System.Drawing.Point(dd, hh)
Me.y4T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.r4T.Location = New System.Drawing.Point(dd, hh)
Me.r4T.Size = New System.Drawing.Size(61, 20)
dd = dd + ddd
Me.rev4T.Location = New System.Drawing.Point(dd, hh)
Me.rev4T.Size = New System.Drawing.Size(61, 20)
'
'backgroundWorkerpp1
'
Me.BackgroundWorkerpp1.WorkerReportsProgress = True
Me.BackgroundWorkerpp1.WorkerSupportsCancellation = True
Me.BackgroundWorkerpp2.WorkerReportsProgress = True
Me.BackgroundWorkerpp2.WorkerSupportsCancellation = True
Me.BackgroundWorkerpp3.WorkerReportsProgress = True
Me.BackgroundWorkerpp3.WorkerSupportsCancellation = True
Me.BackgroundWorkerpp4.WorkerReportsProgress = True
Me.BackgroundWorkerpp4.WorkerSupportsCancellation = True
Me.BackgroundWorkerpp5.WorkerReportsProgress = True
Me.BackgroundWorkerpp5.WorkerSupportsCancellation = True
'
'PlanetForm
'
Me.ClientSize = New System.Drawing.Size(dd + ddd - 25, hh + dhh + 10)
End Sub 'InitializeComponent
_
Shared Sub Main()
Application.Run(New PlanetForm)
End Sub 'Main
End Class 'PlanetForm