📄 form1.frm
字号:
PNum = CInt(Trim(Text1.Text)) '模拟进程数
Limit = CInt(Trim(Text3.Text))
'模拟时间片范围(轮转法) 或者 最高优先级别数 或者 时间间隔范围(FIFC)
Pslice = CInt(Trim(Text2.Text)) 'CPU时间长度
TimeChip = Pslice
'从新定义进程数组
ReDim proc(PNum)
ReDim ProcBak(PNum)
Randomize
'随机赋值
For i = 1 To PNum
proc(i).PName = "进程" + CStr(i)
proc(i).PCPUTime = 0
proc(i).PNeedCPU = 0
proc(i).PPRI = 0
proc(i).PState = "就绪"
proc(i).PSubTime = 0
'判断使用算法
If Round.Value = True Then
proc(i).PNeedCPU = Rnd * (Limit - 3) + 3 '随机取时间片长度
ElseIf Priority.Value = True Then
proc(i).PNeedCPU = Rnd * (Limit * 3) + 3 '随机取时间片长度
proc(i).PPRI = Rnd * (Limit) '随机取优先级
ElseIf Fcfs.Value = True Then
proc(i).PSubTime = Rnd * (Limit) + 3 '随机取提交时间
proc(i).PNeedCPU = Rnd * (Limit - 3) + 3 '随机取时间片长度
End If
'备份数据
ProcBak(i) = proc(i)
Next i
Call ShowR(0) '显示
End Sub
Private Sub Fcfs_Click()
CreatProcess_Click
Text3.Text = "100"
Label3.Caption = "时间间隔"
PPCB.ColumnHeaders.Clear
PPCB.ColumnHeaders.Add , , "进程名称", 800
PPCB.ColumnHeaders.Add , , " 提交时间 ", 800
PPCB.ColumnHeaders.Add , , " 需要的时间片 ", 1200
PPCB.ColumnHeaders.Add , , " 使用的时间片 ", 1200
PPCB.ColumnHeaders.Add , , " 进程状态 ", 1000
End Sub
Private Sub Round_Click()
CreatProcess_Click
Text3.Text = "20"
Label3.Caption = "时间片长度范围(>3) "
PPCB.ColumnHeaders.Clear
PPCB.ColumnHeaders.Add , , "进程名称", 1000
PPCB.ColumnHeaders.Add , , " 需要的时间片 ", 1400
PPCB.ColumnHeaders.Add , , " 使用的时间片 ", 1400
PPCB.ColumnHeaders.Add , , " 进程状态 ", 1000
End Sub
Private Sub Priority_Click()
CreatProcess_Click
Text3.Text = "5"
Label3.Caption = "最高优先级数"
PPCB.ColumnHeaders.Clear
PPCB.ColumnHeaders.Add , , "进程名称", 800
PPCB.ColumnHeaders.Add , , " 优先级 ", 800
PPCB.ColumnHeaders.Add , , " 需要的时间片 ", 1200
PPCB.ColumnHeaders.Add , , " 使用的时间片 ", 1200
PPCB.ColumnHeaders.Add , , " 进程状态 ", 1000
End Sub
Private Function ShowR(Slow As Integer) 'ListView显示进程状态
If Round.Value = True Then '轮转法信息
PPCB.ListItems.Clear
For j = 1 To PNum
Set mItem = PPCB.ListItems.Add(, proc(j).PName, proc(j).PName)
mItem.ListSubItems.Add Key:="A" + proc(j).PName, Text:=Trim(proc(j).PNeedCPU)
mItem.ListSubItems.Add Key:="B" + proc(j).PName, Text:=Trim(proc(j).PCPUTime)
mItem.ListSubItems.Add Key:="D" + proc(j).PName, Text:=Trim(proc(j).PState)
If proc(j).PState = "执行" Then
PPCB.ListItems(j).ForeColor = vbRed
ElseIf proc(j).PState = "就绪" Then
PPCB.ListItems(j).ForeColor = vbBlue
Else
PPCB.ListItems(j).ForeColor = vbGrayText
End If
Next j
ElseIf Priority.Value = True Then '优先级法信息
PPCB.ListItems.Clear
For j = 1 To PNum
Set mItem = PPCB.ListItems.Add(, proc(j).PName, proc(j).PName)
mItem.ListSubItems.Add Key:="A" + proc(j).PName, Text:=Trim(proc(j).PPRI)
mItem.ListSubItems.Add Key:="B" + proc(j).PName, Text:=Trim(proc(j).PNeedCPU)
mItem.ListSubItems.Add Key:="D" + proc(j).PName, Text:=Trim(proc(j).PCPUTime)
mItem.ListSubItems.Add Key:="E" + proc(j).PName, Text:=Trim(proc(j).PState)
If proc(j).PState = "执行" Then
PPCB.ListItems(j).ForeColor = vbRed
ElseIf proc(j).PState = "就绪" Then
PPCB.ListItems(j).ForeColor = vbBlue
Else
PPCB.ListItems(j).ForeColor = vbGrayText
End If
Next j
ElseIf Fcfs.Value = True Then '先来先服务信息
PPCB.ListItems.Clear
For j = 1 To PNum
Set mItem = PPCB.ListItems.Add(, proc(j).PName, proc(j).PName)
mItem.ListSubItems.Add Key:="A" + proc(j).PName, Text:=Trim(ProcBak(j).PSubTime)
mItem.ListSubItems.Add Key:="B" + proc(j).PName, Text:=Trim(proc(j).PNeedCPU)
mItem.ListSubItems.Add Key:="D" + proc(j).PName, Text:=Trim(proc(j).PCPUTime)
mItem.ListSubItems.Add Key:="E" + proc(j).PName, Text:=Trim(proc(j).PState)
If proc(j).PState = "执行" Then
PPCB.ListItems(j).ForeColor = vbRed
ElseIf proc(j).PState = "就绪" Then
PPCB.ListItems(j).ForeColor = vbBlue
Else
PPCB.ListItems(j).ForeColor = vbGrayText
End If
Next j
End If
'-----------延时----------
If Slow = 1 Then
Dim Savetime As Double
Savetime = timeGetTime '记下开始时的时间
While timeGetTime < Savetime + 1000 '循环等待
DoEvents '转让控制权,以便让操作系统处理其它的事件
Wend
End If
End Function
Private Sub Run_Click()
CreatProcess.Enabled = False
Command2.Enabled = False
PBar1.Visible = False
If Round.Value = True Then
Timer1.Enabled = True
ElseIf Priority.Value = True Then
Timer3.Enabled = True
ElseIf Fcfs.Value = True Then
Timer4.Enabled = True
End If
List1.Clear
PBar1.Value = 0
Label7.Caption = ""
End Sub
Private Sub Timer1_Timer() '轮转法
While (Finish = False)
For i = 1 To PNum
If proc(i).PState <> "完成" Then
proc(i).PState = "执行"
Label7.Caption = proc(i).PName
ShowR (1)
RoundR (i)
End If
Next i
Wend
CreatProcess.Enabled = True
Command2.Enabled = True
ShowR (1)
Timer1.Enabled = False
End Sub
Private Sub Timer3_Timer() '优先级法
CurTop = GetPri(1)
While (Finish = False)
i = CurTop
If proc(i).PState <> "完成" Then
proc(i).PState = "执行"
Label7.Caption = proc(i).PName
ShowR (1)
PriorityR (i)
End If
Wend
CreatProcess.Enabled = True
Command2.Enabled = True
ShowR (1)
Timer3.Enabled = False
End Sub
Private Sub Timer4_Timer() '先来先服务
While (Finish = False)
Call FcfsR
Wend
CreatProcess.Enabled = True
Command2.Enabled = True
ShowR (1)
Timer4.Enabled = False
End Sub
Private Function FcfsR() '先来先服务子程序
Dim i As Integer
i = GetFirst
Label7.Caption = proc(i).PName
proc(i).PState = "执行"
ShowR (1)
If proc(i).PNeedCPU > 0 Then '进程没有结束
proc(i).PNeedCPU = 0 '服务完成
proc(i).PState = "完成"
proc(i).PCPUTime = ProcBak(i).PNeedCPU
proc(i).PSubTime = 32767
Pslice = ProcBak(i).PNeedCPU
End If
Call Progress(i) '显示进度条
End Function
Private Function GetFirst() '得到未完成的最先进程
Dim First As Integer
Dim Save As Integer
Save = 0
First = 32767
For i = 1 To PNum
For j = 1 To PNum
If proc(i).PSubTime < First Then
First = proc(i).PSubTime
Save = i
End If
Next j
Next i
GetFirst = Save
End Function
Private Function RoundR(i As Integer) '轮转法子程序
If proc(i).PNeedCPU > 0 Then '进程没有结束
proc(i).PNeedCPU = proc(i).PNeedCPU - Pslice '使用时间片
'记录执行状态
If proc(i).PNeedCPU <= 0 Then '进程完成
proc(i).PState = "完成"
proc(i).PCPUTime = ProcBak(i).PNeedCPU
proc(i).PNeedCPU = 0
Else '时间片用完,转入就绪
proc(i).PCPUTime = proc(i).PCPUTime + Pslice
proc(i).PState = "就绪"
End If
End If
Call Progress(i) '显示进度条
End Function
Private Function PriorityR(i As Integer) '优先级法子程序
Pslice = 0
Chip = 0
While proc(i).PNeedCPU > 0 And i = CurTop
proc(i).PNeedCPU = proc(i).PNeedCPU - TimeChip
proc(i).PCPUTime = proc(i).PCPUTime + TimeChip
Pslice = Pslice + 1
If proc(i).PNeedCPU > 0 Then
Chip = Chip + TimeChip
proc(i).PPRI = proc(i).PPRI - Rnd(5)
'随机减少优先级,实际操作中应该根据情况使用某种算法
Else
Chip = proc(i).PNeedCPU
proc(i).PPRI = -32768
End If
proc(i).PState = "就绪"
CurTop = GetPri(i)
Wend
If proc(i).PNeedCPU <= 0 Then
proc(i).PState = "完成"
proc(i).PCPUTime = ProcBak(i).PNeedCPU
proc(i).PNeedCPU = 0
CurTop = GetPri(i)
End If
Call Progress(i)
End Function
Public Function Finish()
Dim Flag As Boolean
Flag = True
For i = 1 To PNum
If (proc(i).PNeedCPU > 0) Then
Flag = False
Exit For '只要还有一个进程需要时间片,未结束
End If
Next i
Finish = Flag
End Function
Private Function Progress(i As Integer) '进度条显示,进程调度序列显示
PBar1.Visible = True
PBar1.Value = 0
Timer2.Enabled = True
Timer2_Timer
If proc(i).PNeedCPU > 0 Then
If Round Then
List1.AddItem proc(i).PName + " 剩余时间片:" + CStr(proc(i).PNeedCPU)
ElseIf Priority Then
List1.AddItem proc(i).PName + " 此次使用时间片:" + CStr(Chip)
End If
Else
If Round Then
List1.AddItem proc(i).PName + " --完成---使用的时间片" + CStr(proc(i).PCPUTime)
ElseIf Priority Then
List1.AddItem proc(i).PName + " --完成---进程原始优先级" + CStr(ProcBak(i).PPRI)
ElseIf Fcfs.Value = True Then
List1.AddItem proc(i).PName + " --完成---提交时间" + CStr(ProcBak(i).PSubTime)
End If
End If
List1.Selected(List1.ListCount - 1) = True
PBar1.Value = 0
End Function
Private Sub Timer2_Timer()
DoEvents
If Pslice <> 0 And (PBar1.Value + 100 / Pslice) <= 100 Then
PBar1.Value = PBar1.Value + 100 / Pslice
Else
PBar1.Value = 100
Timer2.Enabled = False
End If
End Sub
Private Function GetPri(i As Integer) '得到第一个优先级最高的进程,i为起点
Dim TopPri As Integer
Dim Save As Integer
Save = i
TopPri = proc(i).PPRI
For j = 1 To PNum
If proc(i).PPRI > TopPri Then
TopPri = proc(i).PPRI
Save = i
End If
i = i + 1
If i > PNum Then
i = i - PNum
End If
Next j
CurTop = Save
GetPri = Save
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -