📄 form1.frm
字号:
EndProperty
End
Begin MSComctlLib.Slider Slider1
Height = 255
Left = 3240
TabIndex = 31
Top = 2520
Width = 2295
_ExtentX = 4048
_ExtentY = 450
_Version = 393216
LargeChange = 1
Min = 1
Max = 3
SelStart = 2
Value = 2
End
Begin VB.Label Label15
Caption = "~"
Height = 255
Left = 4200
TabIndex = 34
Top = 1080
Width = 375
End
Begin VB.Label Label14
Alignment = 2 'Center
Caption = "随机时间片范围:"
Height = 255
Left = 3480
TabIndex = 33
Top = 600
Width = 1815
End
Begin VB.Label Label16
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "速度调节"
Height = 180
Left = 3960
TabIndex = 32
Top = 2160
Width = 720
End
Begin VB.Shape Shape3
BackColor = &H00FFC0C0&
BackStyle = 1 'Opaque
Height = 2775
Left = 120
Top = 3960
Width = 4215
End
Begin VB.Label Label18
Caption = "初始设置:"
Height = 255
Left = 0
TabIndex = 7
Top = 240
Width = 1095
End
Begin VB.Label Label3
Alignment = 2 'Center
BackColor = &H0000FFFF&
Caption = "运行完毕的进程"
Height = 255
Left = 120
TabIndex = 6
Top = 3720
Width = 4215
End
Begin VB.Label Label1
Alignment = 2 'Center
BackColor = &H000080FF&
Caption = "正在运行的进程"
Height = 255
Left = 5640
TabIndex = 5
Top = 3480
Width = 4215
End
Begin VB.Label Label13
Caption = "CPU时间片长度:"
Height = 375
Left = 360
TabIndex = 4
Top = 1080
Width = 1575
End
Begin VB.Label Label9
Caption = "进程模拟数量:"
Height = 375
Left = 360
TabIndex = 3
Top = 600
Width = 1455
End
Begin VB.Label Label2
Alignment = 2 'Center
BackColor = &H00FFFF80&
Caption = "已就绪的进程"
Height = 180
Left = 5760
TabIndex = 0
Top = 720
Width = 3960
End
Begin VB.Shape Shape1
BackColor = &H00FFFFFF&
BackStyle = 1 'Opaque
Height = 2775
Left = 5640
Top = 480
Width = 4215
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'定义全局变量
Dim mItem As ListItem '定义ListItem对象,用于把数据插入ListView控件(这样速度很快)。
Dim PRI As Boolean '判断是否采用何种算法
Dim P_Run As PCB '存放当前运行的进程控制块中的数据
Dim Proc() As PCB '存放模拟的进程
Dim Proc_B() As PCB '备份模拟的进程(用于比较模式)
Dim Proc_T() As Integer '存放进程结束时所用的总时间片数
Dim N, i As Integer 'N存放模拟的进程数(默认为5)
Dim TimeChip As Integer '每个CPU单位分配的时间片(默认为3)
Dim Sum As Integer '存放总调度次数
Dim NSum As Integer '存放总时间片数
Dim A, B As Integer '存放随机数上下界
Dim Pause_R As Integer '存放被暂停的Timer
Dim Comp_P As Integer '用于判断是否运行比较模式(-1表示否)
Dim Comp_T As String '用于存放比较结果
Private Function Get_R(ByVal NCPU As Integer, ByVal CPU As Integer) As Integer '计算分配的CPU单位(轮转发)
Get_R = Int((NCPU - CPU) / 3) + 1
End Function
Private Sub P_Index() '对进程按优先数进行排序,并加入到P_Ready(ListView控件)中
Dim T As PCB '用于在排序过程中临时存放数据
'用 冒泡排序法按 优先级 降序 进行排序
For i = 1 To N
For j = 1 To N - 1
If Proc(i).P_PRI >= Proc(j).P_PRI Then
'交换数据
T = Proc(i)
Proc(i) = Proc(j)
Proc(j) = T
End If
Next j
Next i
'清除就绪队列
P_Ready.ListItems.Clear
'向就绪队列中插入进程
For i = 1 To N
If Proc(i).P_State <> "F" Then
'初始化mItem对象,并向P_Ready(ListView控件)中添加数据
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)
End If
Next i
End Sub
Private Sub Start_P() '开始
Picture1.Visible = False
'取得就绪站顶的PCB放入P_Run
P_Run.P_Name = P_Ready.ListItems(1).Text
P_Run.P_CPU = CInt(P_Ready.ListItems(1).ListSubItems(1).Text)
P_Run.P_NCPU = CInt(P_Ready.ListItems(1).ListSubItems(2).Text)
P_Run.P_PRI = CInt(P_Ready.ListItems(1).ListSubItems(3).Text)
P_Run.P_State = P_Ready.ListItems(1).ListSubItems(4).Text
'初始化控件
Text1.Text = P_Run.P_Name
Label7.Caption = CStr(P_Run.P_CPU)
'初始化完成度进度条
PB2.Max = P_Run.P_NCPU
PB2.Value = P_Run.P_CPU
Label11.Caption = CStr(P_Run.P_PRI)
'把PCB从P_Ready中移除
P_Ready.ListItems.Remove (1)
'初始化移动Bar(TextBox控件)的位置
Text1.Top = W_Top
Text1.Left = W_Left
Text1.Visible = True
'判断是否为轮转法
If Not (PRI) Then
'根据CPU单位计算时间片数
TimeChip = CInt(Text3.Text)
TimeChip = TimeChip * P_Run.P_PRI
End If
Label6.Caption = CStr(TimeChip)
'初始化时间片进度条
PB1.Max = TimeChip
PB1.Value = TimeChip
'开始移动控件
Timer1.Enabled = True
End Sub
Private Sub P_End() '完成和结束处理
Dim Prompt_F As String
'隐藏移动Bar
Text1.Visible = False
P_Run.P_State = "F"
'纪录进程结束时间片
Proc_T(CInt(Mid(P_Run.P_Name, 3, Len(P_Run.P_Name) - 2))) = NSum
'置完成的PCB(用于判断是否向P_Ready中添加)状态
If PRI Then
For i = 1 To N - 1
Proc(i) = Proc(i + 1)
Next i
Proc(N) = P_Run
Proc(N).P_PRI = -10000
End If
'把该进程加入到P_Finish(ListView控件)完成队列中
Set mItem = P_Finish.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)
'判断是否结束
If P_Ready.ListItems.Count > 0 Then
Start_P
Else
'如果结束
If Comp_P = -1 Then
'如果是正常模式
'生成结果文本
Prompt_F = Me.Caption + vbCrLf + "所有进程运行完成! " + vbCrLf + vbCrLf + "模拟进程:" + CStr(N) + "个" + vbCrLf
Prompt_F = Prompt_F + "总时间片:" + CStr(NSum) + "片" + vbCrLf + "调度次数:" + CStr(Sum) + "次" + vbCrLf + "每CPU单位分配的时间片数:" + Text3.Text + vbCrLf + vbCrLf
Prompt_F = Prompt_F + "名称 需要时间片数 优先级/CPU单位 结束时间片" + vbCrLf
For i = 1 To N
Prompt_F = Prompt_F + Proc_B(i).P_Name + " " + CStr(Proc_B(i).P_NCPU) + " " + CStr(Proc_B(i).P_PRI) + " " + CStr(Proc_T(i)) + vbCrLf
Next i
'本结果赋给Frm_Result.Text1
Form2.Text1.Text = Prompt_F
'显示结果
Form2.Show vbModal
Else
If Comp_P = 1 Then
'如果是比较模式的第一次运行
'改变标志,表示已经运行过一次
Comp_P = Comp_P - 1
'生成结果文本
Comp_T = Me.Caption + vbCrLf + "所有进程运行完成! " + vbCrLf + vbCrLf + "模拟进程:" + CStr(N) + "个" + vbCrLf
Comp_T = Comp_T + "总时间片:" + CStr(NSum) + "片" + vbCrLf + "调度次数:" + CStr(Sum) + "次" + vbCrLf + "每CPU单位分配的时间片数:" + Text3.Text + vbCrLf + vbCrLf
Comp_T = Comp_T + "名称 需要时间片数 优先级/CPU单位 结束时间片" + vbCrLf
For i = 1 To N
Comp_T = Comp_T + Proc_B(i).P_Name + " " + CStr(Proc_B(i).P_NCPU) + " " + CStr(Proc_B(i).P_PRI) + " " + CStr(Proc_T(i)) + vbCrLf
Next i
'判断运行过的算法,设置未运行的算法为当前算法
If PRI Then
Option2.Value = True
Else
Option1.Value = True
End If
'清除就绪队列
P_Ready.ListItems.Clear
'利用备份数据重新初始化Proc()
For i = 1 To N
Proc(i) = Proc_B(i)
If PRI Then
Proc(i).P_PRI = Int((36 - Proc(i).P_NCPU) / 3)
Else
Proc(i).P_PRI = Get_R(Proc(i).P_NCPU, Proc(i).P_CPU)
End If
Proc_B(i) = Proc(i)
'把新数据加入到就绪队列中
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
'重新开始运行
Start.Value = True
Exit Sub
Else
'运行全部结束
'设置标志位
Comp_P = Comp_P - 1
'继续生成结果文本
Comp_T = Comp_T + vbCrLf + Me.Caption + vbCrLf + "所有进程运行完成! " + vbCrLf + vbCrLf + "模拟进程:" + CStr(N) + "个" + vbCrLf
Comp_T = Comp_T + "总时间片:" + CStr(NSum) + "片" + vbCrLf + "调度次数:" + CStr(Sum) + "次" + vbCrLf + "每CPU单位分配的时间片数:" + Text3.Text + vbCrLf + vbCrLf
Comp_T = Comp_T + "名称 需要时间片数 优先级/CPU单位 结束时间片" + vbCrLf
For i = 1 To N
Comp_T = Comp_T + Proc_B(i).P_Name + " " + CStr(Proc_B(i).P_NCPU) + " " + CStr(Proc_B(i).P_PRI) + " " + CStr(Proc_T(i)) + vbCrLf
Next i
Frm_Result.Text1.Text = Comp_T
Comp_T = ""
'显示结果
Frm_Result.Show vbModal
End If
End If
'恢复按键功能
Simulation.Enabled = True
Start.Enabled = True
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -