📄 frm_main.frm
字号:
Stop_R.Enabled = False
End If
End Sub
Private Sub P_Back() '返回就绪队列
Dim Find_Pos As Boolean
'判断算法
If PRI Then
'如果是优先数法
'优先数减一
P_Run.P_PRI = P_Run.P_PRI - 1
'把运行的PCB数据放回数组Proc
Find_Pos = False
For i = 2 To N
If P_Run.P_PRI <= Proc(i).P_PRI Then
Proc(i - 1) = Proc(i)
Else
Proc(i - 1) = P_Run
Find_Pos = True
Exit For
End If
Next i
If Not (Find_Pos) Then Proc(N) = P_Run
'刷新P_Ready
P_Ready.ListItems.Clear
For i = 1 To N
If Proc(i).P_State <> "F" Then
Set mItem = P_Ready.ListItems.Add(, "P" + Proc(i).P_Name, Proc(i).P_Name)
mItem.ListSubItems.Add Key:="A" + Proc(i).P_Name, Text:=Trim(Proc(i).P_CPU)
mItem.ListSubItems.Add Key:="B" + Proc(i).P_Name, Text:=Trim(Proc(i).P_NCPU)
mItem.ListSubItems.Add Key:="C" + Proc(i).P_Name, Text:=Trim(Proc(i).P_PRI)
mItem.ListSubItems.Add Key:="D" + Proc(i).P_Name, Text:=Trim(Proc(i).P_State)
Else
Exit For
End If
Next i
Else
'如果是轮转法
'重新计算分配的CPU单位
P_Run.P_PRI = Get_R(P_Run.P_NCPU, P_Run.P_CPU)
'放入就绪队列的队尾
Set mItem = P_Ready.ListItems.Add(, "P" + P_Run.P_Name, P_Run.P_Name)
mItem.ListSubItems.Add Key:="A" + P_Run.P_Name, Text:=Trim(P_Run.P_CPU)
mItem.ListSubItems.Add Key:="B" + P_Run.P_Name, Text:=Trim(P_Run.P_NCPU)
mItem.ListSubItems.Add Key:="C" + P_Run.P_Name, Text:=Trim(P_Run.P_PRI)
mItem.ListSubItems.Add Key:="D" + P_Run.P_Name, Text:=Trim(P_Run.P_State)
End If
Text1.Visible = False
If P_Ready.ListItems.Count > 0 Then
Start_P
End If
End Sub
Private Sub Comp_Click()
If P_Ready.ListItems.Count > 0 Then
'置标志位
Comp_P = 1
Comp_T = ""
Start.Value = True
Else
MsgBox "请先模拟进程!!", vbInformation, "LingLanX"
End If
End Sub
Private Sub CPU_T_Timer() '控制时间片
Dim M As Integer
DoEvents
M = PB1.Value
DoEvents
P_Run.P_CPU = P_Run.P_CPU + 1
PB2.Value = PB2.Value + 1
DoEvents
M = M - 1
PB1.Value = PB1.Value - 1
DoEvents
NSum = NSum + 1
If M <= 0 Or P_Run.P_CPU = P_Run.P_NCPU Then
DoEvents
Label6.Caption = "0"
PB1.Value = 0
PB2.Value = 0
DoEvents
Label11.Caption = "0"
Picture1.Visible = False
DoEvents
If P_Run.P_CPU = P_Run.P_NCPU Then
Timer2.Enabled = True
Else
Timer3.Enabled = True
End If
CPU_T.Enabled = False
End If
End Sub
Private Sub Exit_Click()
'结束整个程序
End
End Sub
Private Sub Form_Load()
'窗体位置居中
Me.Top = (Screen.Height - Me.Height) / 2
Me.Left = (Screen.Width - Me.Width) / 2
'置随机数种子
Randomize
'默认选择 优先数算法
PRI = True
'默认为非比较模式
Comp_P = -1
'把结果窗口调入内存
Load Frm_Result
End Sub
Private Sub Option1_Click()
'为优先数算法初始化ListView表头
PRI = True
Me.Caption = "进程调度模拟-LinglanX STUDIO-[优先数法]"
P_Ready.ColumnHeaders.Clear
P_Ready.ColumnHeaders.Add , , "名称", 560
P_Ready.ColumnHeaders.Add , , "使用时间片", 1100
P_Ready.ColumnHeaders.Add , , "需要时间片", 1100
P_Ready.ColumnHeaders.Add , , "优先级", 760
P_Ready.ColumnHeaders.Add , , "状态", 460
P_Finish.ColumnHeaders.Clear
P_Finish.ColumnHeaders.Add , , "名称", 560
P_Finish.ColumnHeaders.Add , , "使用时间片", 1100
P_Finish.ColumnHeaders.Add , , "需要时间片", 1100
P_Finish.ColumnHeaders.Add , , "优先级", 760
P_Finish.ColumnHeaders.Add , , "状态", 460
End Sub
Private Sub Option2_Click()
'为轮转法初始化ListView表头
PRI = False
Me.Caption = "进程调度模拟-LinglanX STUDIO-[轮转法]"
P_Ready.ColumnHeaders.Clear
P_Ready.ColumnHeaders.Add , , "名称", 560
P_Ready.ColumnHeaders.Add , , "使用时间片", 1100
P_Ready.ColumnHeaders.Add , , "需要时间片", 1100
P_Ready.ColumnHeaders.Add , , "时间片", 760
P_Ready.ColumnHeaders.Add , , "状态", 460
P_Finish.ColumnHeaders.Clear
P_Finish.ColumnHeaders.Add , , "名称", 560
P_Finish.ColumnHeaders.Add , , "使用时间片", 1100
P_Finish.ColumnHeaders.Add , , "需要时间片", 1100
P_Finish.ColumnHeaders.Add , , "时间片", 760
P_Finish.ColumnHeaders.Add , , "状态", 460
End Sub
Private Sub Simulation_Click()
Dim j As Integer
'取得随机时间片数的上界
A = CInt(Text4.Text)
If A <= 0 Then
MsgBox "请输入随即时间片数的上界!", vbInformation, "LingLanX"
SSTab1.Tab = 1
Text4.SetFocus
Exit Sub
End If
'取得随机时间片数的下界
B = CInt(Text5.Text)
If B <= 0 Then
MsgBox "请输入随即时间片数的下界!", vbInformation, "LingLanX"
SSTab1.Tab = 1
Text5.SetFocus
Exit Sub
End If
'取得模拟进程数
N = CInt(Text2.Text)
If N <= 0 Then
MsgBox "对不起!请输入模拟进程数。", vbInformation, "LingLanX"
SSTab1.Tab = 1
Text2.SetFocus
Exit Sub
End If
'从新定义进程数组
ReDim Proc(N)
ReDim Proc_T(N)
ReDim Proc_B(N)
'随机赋值
For i = 1 To N
Proc(i).P_Name = "进程" + CStr(i)
Proc(i).P_State = "W"
Proc(i).P_CPU = 0
Proc(i).P_NCPU = Rnd * (B - A) + A '随机取
'判断使用算法
If PRI Then
'根据占用CPU的大小生成优先数
Proc(i).P_PRI = Int((36 - Proc(i).P_NCPU) / 3)
Else
'分配CPU单位
Proc(i).P_PRI = Get_R(Proc(i).P_NCPU, Proc(i).P_CPU)
End If
'备份数据
Proc_B(i) = Proc(i)
Next i
'如果是 优先数算法则 排序 否则直接添加到P_Ready中
If PRI Then
P_Index
Else
P_Ready.ListItems.Clear
For i = 1 To N
Set mItem = P_Ready.ListItems.Add(, Proc(i).P_Name, Proc(i).P_Name)
mItem.ListSubItems.Add Key:="A" + Proc(i).P_Name, Text:=Trim(Proc(i).P_CPU)
mItem.ListSubItems.Add Key:="B" + Proc(i).P_Name, Text:=Trim(Proc(i).P_NCPU)
mItem.ListSubItems.Add Key:="C" + Proc(i).P_Name, Text:=Trim(Proc(i).P_PRI)
mItem.ListSubItems.Add Key:="D" + Proc(i).P_Name, Text:=Trim(Proc(i).P_State)
Next i
End If
End Sub
Private Sub Slider1_Change() '调节动画速度
'调节Timer控件的间隔时间
Select Case Slider1.Value
Case Is = 1
'快
Timer1.Interval = 1
Timer2.Interval = 1
Timer3.Interval = 1
CPU_T.Interval = 1
Case Is = 2
'中
Timer1.Interval = 55
Timer2.Interval = 55
Timer3.Interval = 55
CPU_T.Interval = 300
Case Is = 3
'慢
Timer1.Interval = 100
Timer2.Interval = 100
Timer3.Interval = 100
CPU_T.Interval = 500
End Select
End Sub
Private Sub Start_Click()
'取每CPU单位分配的时间片
TimeChip = CInt(Text3.Text)
'判断TimeChip是否有效
If TimeChip <= 0 Then
MsgBox "对不起,请规定CPU每次分配的时间片。", vbInformation, "LingLanX"
SSTab1.Tab = 1
Text3.SetFocus
Exit Sub
End If
'判断就绪队列中是否有进程
If P_Ready.ListItems.Count <= 0 Then
i = MsgBox("对不起,就绪队列中没有进程。要模拟进程吗?", vbInformation + vbYesNo, "LingLanX")
If i = vbYes Then
Simulation.Value = 1
End If
Exit Sub
End If
'清除完成队列
P_Finish.ListItems.Clear
'屏蔽按钮
SSTab1.Enabled = False
Simulation.Enabled = False
Start.Enabled = False
Comp.Enabled = False
Stop_R.Enabled = True
Pause_R = -1
'清除计数器
Sum = 0
NSum = 0
'开始运行
Start_P
End Sub
Private Sub Stop_R_Click() '暂停系统
'Pause_R=-1表示要暂停,否则表示恢复暂停
'判断当前运行的Timer
If Pause_R = -1 Then
If Timer1.Enabled = True Then
Timer1.Enabled = False
Pause_R = 1
ElseIf Timer2.Enabled = True Then
Timer2.Enabled = False
Pause_R = 2
ElseIf Timer3.Enabled = True Then
Timer3.Enabled = False
Pause_R = 3
Else
CPU_T.Enabled = False
Pause_R = 4
End If
Else
'恢复运行
Select Case Pause_R
Case Is = 1
Timer1.Enabled = True
Case Is = 2
Timer2.Enabled = True
Case Is = 3
Timer3.Enabled = True
Case Is = 4
CPU_T.Enabled = True
End Select
Pause_R = -1
End If
End Sub
Private Sub Timer1_Timer() '把移动Bar从就绪队列移到运行队列
If Text1.Left < R_Left Then
'先水平移动
'Text1.Left = Text1.Left + 222
Text1.Left = Text1.Left + 444
Else
'在垂直移动
Text1.Left = R_Left
If Text1.Top > R_Top Then
'Text1.Top = Text1.Top - 240
Text1.Top = Text1.Top - 480
Else
'到达指定位置后
Text1.Top = R_Top
Timer1.Enabled = False
Picture1.Visible = True
CPU_T.Enabled = True
Sum = Sum + 1
End If
End If
End Sub
Private Sub Timer2_Timer() '把移动Bar从运行队列移到完成队列
If Text1.Top < T2_Top Then
'先垂直移动
'Text1.Top = Text1.Top + 312
Text1.Top = Text1.Top + 624
Else
Text1.Top = T2_Top
If Text1.Left > T2_Left Then
'在水平移动
'Text1.Left = Text1.Left - 222
Text1.Left = Text1.Left - 444
Else
'到达指定位置
Text1.Left = T2_Left
Timer2.Enabled = False
P_End
End If
End If
End Sub
Private Sub Timer3_Timer() '把移动Bar从运行队列移到就绪队列
If Text1.Top < T1_Top Then
'先垂直移动
'Text1.Top = Text1.Top + 204
Text1.Top = Text1.Top + 408
Else
Text1.Top = T1_Top
If Text1.Left > T1_Left Then
'在水平移动
'Text1.Left = Text1.Left - 222
Text1.Left = Text1.Left - 444
Else
'到达指定位置
Text1.Left = T1_Left
Timer3.Enabled = False
P_Back
End If
End If
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -