⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frm_main.frm

📁 一个模拟操作系统“优先数法”的进程调度程序!大家看看!
💻 FRM
📖 第 1 页 / 共 3 页
字号:
      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 + -