?? 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 + -