📄 frm_main.frm
字号:
EndProperty
BeginProperty ColumnHeader(2) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 1
Text = "使用时间片"
Object.Width = 1941
EndProperty
BeginProperty ColumnHeader(3) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 2
Text = "需要时间片"
Object.Width = 1941
EndProperty
BeginProperty ColumnHeader(4) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 3
Text = "优先级"
Object.Width = 1342
EndProperty
BeginProperty ColumnHeader(5) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 4
Text = "状态"
Object.Width = 811
EndProperty
End
Begin VB.Timer Timer3
Enabled = 0 'False
Interval = 55
Left = 2520
Top = 4920
End
Begin VB.Timer Timer2
Enabled = 0 'False
Interval = 55
Left = 2040
Top = 4920
End
Begin VB.Timer Timer1
Enabled = 0 'False
Interval = 55
Left = 1560
Top = 4920
End
Begin MSComctlLib.ListView P_Finish
Height = 2295
Left = 240
TabIndex = 5
Top = 3360
Width = 3975
_ExtentX = 7011
_ExtentY = 4048
View = 3
LabelWrap = -1 'True
HideSelection = -1 'True
FullRowSelect = -1 'True
GridLines = -1 'True
HotTracking = -1 'True
_Version = 393217
ForeColor = -2147483640
BackColor = -2147483643
BorderStyle = 1
Appearance = 0
NumItems = 5
BeginProperty ColumnHeader(1) {BDD1F052-858B-11D1-B16A-00C0F0283628}
Text = "名称"
Object.Width = 988
EndProperty
BeginProperty ColumnHeader(2) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 1
Text = "使用时间片"
Object.Width = 1941
EndProperty
BeginProperty ColumnHeader(3) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 2
Text = "需要时间片"
Object.Width = 1941
EndProperty
BeginProperty ColumnHeader(4) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 3
Text = "优先级"
Object.Width = 1342
EndProperty
BeginProperty ColumnHeader(5) {BDD1F052-858B-11D1-B16A-00C0F0283628}
SubItemIndex = 4
Text = "状态"
Object.Width = 811
EndProperty
End
Begin MSComctlLib.Slider Slider1
Height = 255
Left = 120
TabIndex = 35
Top = 6120
Width = 4215
_ExtentX = 7435
_ExtentY = 450
_Version = 393216
LargeChange = 1
Min = 1
Max = 3
SelStart = 2
Value = 2
End
Begin VB.Label Label16
Alignment = 2 'Center
AutoSize = -1 'True
Caption = "动画速度(速度加快V1.01版)"
Height = 180
Left = 240
TabIndex = 36
Top = 5880
Width = 2250
End
Begin VB.Label Label3
Alignment = 2 'Center
BackColor = &H008080FF&
Caption = "完成的进程"
ForeColor = &H00FFFFFF&
Height = 180
Left = 240
TabIndex = 2
Top = 3120
Width = 3960
End
Begin VB.Shape Shape3
BackColor = &H00FFC0C0&
BackStyle = 1 'Opaque
Height = 2775
Left = 120
Top = 3000
Width = 4215
End
Begin VB.Label Label2
Alignment = 2 'Center
BackColor = &H008080FF&
Caption = "就绪的进程"
ForeColor = &H00FFFFFF&
Height = 180
Left = 240
TabIndex = 1
Top = 240
Width = 3960
End
Begin VB.Shape Shape2
BackColor = &H00C0FFC0&
BackStyle = 1 'Opaque
Height = 2775
Left = 120
Top = 120
Width = 4215
End
Begin VB.Label Label1
Alignment = 2 'Center
BackColor = &H008080FF&
Caption = "正在运行的进程"
ForeColor = &H00FFFFFF&
Height = 180
Left = 4680
TabIndex = 0
Top = 240
Width = 3960
End
Begin VB.Shape Shape1
BackColor = &H00C0FFFF&
BackStyle = 1 'Opaque
Height = 2535
Left = 4560
Top = 120
Width = 4215
End
End
Attribute VB_Name = "Frm_Main"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'**********************************************************
'* LingLanX STUDIO *
'* E_Mail:LianLan1@sian.com *
'* OICQ: 64775590 *
'* 2002-5-13 *
'* 操作系统进程调度模拟 *
'**********************************************************
'* 姓名:王煜冬 *
'* 班级:9901-8 *
'* 学号:19992161 *
'**********************************************************
'定义全局变量
Dim mItem As ListItem '定义ListItem对象,用于把数据插入ListView控件(这样速度很快)。
Dim PRI As Boolean '判断是否采用优先数法(PRI=True)
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存放模拟的进程数(默认为6)
Dim TimeChip As Integer '每个CPU单位分配的时间片(默认为2)
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
Frm_Result.Text1.Text = Prompt_F
'显示结果
Frm_Result.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
'恢复按键功能
SSTab1.Enabled = True
Simulation.Enabled = True
Start.Enabled = True
Comp.Enabled = True
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -