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

📄 form1.frm

📁 课程设计自己编写的一个进程调度演示程序
💻 FRM
📖 第 1 页 / 共 2 页
字号:
   PNum = CInt(Trim(Text1.Text))   '模拟进程数
   Limit = CInt(Trim(Text3.Text))
   '模拟时间片范围(轮转法)  或者 最高优先级别数  或者 时间间隔范围(FIFC)
   Pslice = CInt(Trim(Text2.Text)) 'CPU时间长度
   TimeChip = Pslice
    '从新定义进程数组
    ReDim proc(PNum)
    ReDim ProcBak(PNum)
    
    Randomize
    
    '随机赋值
    For i = 1 To PNum
        proc(i).PName = "进程" + CStr(i)
        proc(i).PCPUTime = 0
        proc(i).PNeedCPU = 0
        proc(i).PPRI = 0
        proc(i).PState = "就绪"
        proc(i).PSubTime = 0
        '判断使用算法
        If Round.Value = True Then
           proc(i).PNeedCPU = Rnd * (Limit - 3) + 3  '随机取时间片长度
           
        ElseIf Priority.Value = True Then
            proc(i).PNeedCPU = Rnd * (Limit * 3) + 3 '随机取时间片长度
            proc(i).PPRI = Rnd * (Limit)            '随机取优先级
        ElseIf Fcfs.Value = True Then
            proc(i).PSubTime = Rnd * (Limit) + 3    '随机取提交时间
            proc(i).PNeedCPU = Rnd * (Limit - 3) + 3  '随机取时间片长度
        End If
        
        '备份数据
        ProcBak(i) = proc(i)
    Next i
    
    Call ShowR(0)     '显示

End Sub

Private Sub Fcfs_Click()
    CreatProcess_Click
    Text3.Text = "100"
    Label3.Caption = "时间间隔"
    PPCB.ColumnHeaders.Clear
    PPCB.ColumnHeaders.Add , , "进程名称", 800
    PPCB.ColumnHeaders.Add , , " 提交时间 ", 800
    PPCB.ColumnHeaders.Add , , " 需要的时间片 ", 1200
    PPCB.ColumnHeaders.Add , , " 使用的时间片 ", 1200
    PPCB.ColumnHeaders.Add , , " 进程状态 ", 1000
End Sub

Private Sub Round_Click()
    CreatProcess_Click
    Text3.Text = "20"
    Label3.Caption = "时间片长度范围(>3) "
    PPCB.ColumnHeaders.Clear
    PPCB.ColumnHeaders.Add , , "进程名称", 1000
    PPCB.ColumnHeaders.Add , , " 需要的时间片 ", 1400
    PPCB.ColumnHeaders.Add , , " 使用的时间片 ", 1400
    PPCB.ColumnHeaders.Add , , " 进程状态 ", 1000
End Sub

Private Sub Priority_Click()
    CreatProcess_Click
    Text3.Text = "5"
    Label3.Caption = "最高优先级数"
    PPCB.ColumnHeaders.Clear
    PPCB.ColumnHeaders.Add , , "进程名称", 800
    PPCB.ColumnHeaders.Add , , " 优先级 ", 800
    PPCB.ColumnHeaders.Add , , " 需要的时间片 ", 1200
    PPCB.ColumnHeaders.Add , , " 使用的时间片 ", 1200
    PPCB.ColumnHeaders.Add , , " 进程状态 ", 1000
End Sub
Private Function ShowR(Slow As Integer)   'ListView显示进程状态
    If Round.Value = True Then         '轮转法信息
       PPCB.ListItems.Clear
       For j = 1 To PNum
            Set mItem = PPCB.ListItems.Add(, proc(j).PName, proc(j).PName)
            mItem.ListSubItems.Add Key:="A" + proc(j).PName, Text:=Trim(proc(j).PNeedCPU)
            mItem.ListSubItems.Add Key:="B" + proc(j).PName, Text:=Trim(proc(j).PCPUTime)
            mItem.ListSubItems.Add Key:="D" + proc(j).PName, Text:=Trim(proc(j).PState)
            If proc(j).PState = "执行" Then
               PPCB.ListItems(j).ForeColor = vbRed
            ElseIf proc(j).PState = "就绪" Then
               PPCB.ListItems(j).ForeColor = vbBlue
            Else
               PPCB.ListItems(j).ForeColor = vbGrayText
            End If
      Next j
    ElseIf Priority.Value = True Then    '优先级法信息
       PPCB.ListItems.Clear
       For j = 1 To PNum
            Set mItem = PPCB.ListItems.Add(, proc(j).PName, proc(j).PName)
            mItem.ListSubItems.Add Key:="A" + proc(j).PName, Text:=Trim(proc(j).PPRI)
            mItem.ListSubItems.Add Key:="B" + proc(j).PName, Text:=Trim(proc(j).PNeedCPU)
            mItem.ListSubItems.Add Key:="D" + proc(j).PName, Text:=Trim(proc(j).PCPUTime)
            mItem.ListSubItems.Add Key:="E" + proc(j).PName, Text:=Trim(proc(j).PState)
            If proc(j).PState = "执行" Then
               PPCB.ListItems(j).ForeColor = vbRed
            ElseIf proc(j).PState = "就绪" Then
               PPCB.ListItems(j).ForeColor = vbBlue
            Else
               PPCB.ListItems(j).ForeColor = vbGrayText
            End If
       Next j
    ElseIf Fcfs.Value = True Then      '先来先服务信息
         PPCB.ListItems.Clear
       For j = 1 To PNum
            Set mItem = PPCB.ListItems.Add(, proc(j).PName, proc(j).PName)
            mItem.ListSubItems.Add Key:="A" + proc(j).PName, Text:=Trim(ProcBak(j).PSubTime)
            mItem.ListSubItems.Add Key:="B" + proc(j).PName, Text:=Trim(proc(j).PNeedCPU)
            mItem.ListSubItems.Add Key:="D" + proc(j).PName, Text:=Trim(proc(j).PCPUTime)
            mItem.ListSubItems.Add Key:="E" + proc(j).PName, Text:=Trim(proc(j).PState)
            If proc(j).PState = "执行" Then
               PPCB.ListItems(j).ForeColor = vbRed
            ElseIf proc(j).PState = "就绪" Then
               PPCB.ListItems(j).ForeColor = vbBlue
            Else
               PPCB.ListItems(j).ForeColor = vbGrayText
            End If
       Next j
        
    End If
    '-----------延时----------
    If Slow = 1 Then
    Dim Savetime As Double
    Savetime = timeGetTime '记下开始时的时间
    While timeGetTime < Savetime + 1000 '循环等待
    DoEvents '转让控制权,以便让操作系统处理其它的事件
    Wend
    End If
End Function
Private Sub Run_Click()
  CreatProcess.Enabled = False
  Command2.Enabled = False
  PBar1.Visible = False
  If Round.Value = True Then
        Timer1.Enabled = True
  ElseIf Priority.Value = True Then
        Timer3.Enabled = True
  ElseIf Fcfs.Value = True Then
        Timer4.Enabled = True
  End If
  List1.Clear
  PBar1.Value = 0
  Label7.Caption = ""
End Sub

Private Sub Timer1_Timer()         '轮转法
 While (Finish = False)
        For i = 1 To PNum
          If proc(i).PState <> "完成" Then
             proc(i).PState = "执行"
             Label7.Caption = proc(i).PName
             ShowR (1)
             RoundR (i)
          
          End If
        Next i
    Wend
    CreatProcess.Enabled = True
    Command2.Enabled = True
    ShowR (1)
    Timer1.Enabled = False
End Sub
Private Sub Timer3_Timer()      '优先级法
  CurTop = GetPri(1)
   While (Finish = False)
          i = CurTop
          If proc(i).PState <> "完成" Then
             proc(i).PState = "执行"
             Label7.Caption = proc(i).PName
             ShowR (1)
             PriorityR (i)
          End If
    Wend
    
    CreatProcess.Enabled = True
    Command2.Enabled = True
    ShowR (1)
    Timer3.Enabled = False
End Sub
Private Sub Timer4_Timer()  '先来先服务
   While (Finish = False)
      Call FcfsR
   Wend
    CreatProcess.Enabled = True
    Command2.Enabled = True
    ShowR (1)
    Timer4.Enabled = False
   
End Sub
Private Function FcfsR()     '先来先服务子程序
    Dim i As Integer
    i = GetFirst
    Label7.Caption = proc(i).PName
    proc(i).PState = "执行"
    ShowR (1)
    If proc(i).PNeedCPU > 0 Then                        '进程没有结束
                  proc(i).PNeedCPU = 0     '服务完成
                  proc(i).PState = "完成"
                  proc(i).PCPUTime = ProcBak(i).PNeedCPU
                  proc(i).PSubTime = 32767
                  Pslice = ProcBak(i).PNeedCPU
     End If
    Call Progress(i)         '显示进度条
End Function
Private Function GetFirst()         '得到未完成的最先进程
    Dim First As Integer
    Dim Save  As Integer
    Save = 0
    First = 32767
    
    For i = 1 To PNum
      For j = 1 To PNum
          If proc(i).PSubTime < First Then
              First = proc(i).PSubTime
              Save = i
          End If
      Next j
    Next i
    
    GetFirst = Save
    
End Function
Private Function RoundR(i As Integer) '轮转法子程序
        
        If proc(i).PNeedCPU > 0 Then                        '进程没有结束
          proc(i).PNeedCPU = proc(i).PNeedCPU - Pslice     '使用时间片
                                              '记录执行状态
              
              If proc(i).PNeedCPU <= 0 Then                     '进程完成
                  proc(i).PState = "完成"
                  proc(i).PCPUTime = ProcBak(i).PNeedCPU
                  proc(i).PNeedCPU = 0
              Else                                             '时间片用完,转入就绪
                  proc(i).PCPUTime = proc(i).PCPUTime + Pslice
                  proc(i).PState = "就绪"
             End If
             
        End If
        Call Progress(i)         '显示进度条
End Function
Private Function PriorityR(i As Integer) '优先级法子程序
    Pslice = 0
    Chip = 0
   While proc(i).PNeedCPU > 0 And i = CurTop
        proc(i).PNeedCPU = proc(i).PNeedCPU - TimeChip
        proc(i).PCPUTime = proc(i).PCPUTime + TimeChip
        Pslice = Pslice + 1
        If proc(i).PNeedCPU > 0 Then
           Chip = Chip + TimeChip
           proc(i).PPRI = proc(i).PPRI - Rnd(5)
           '随机减少优先级,实际操作中应该根据情况使用某种算法
        Else
           Chip = proc(i).PNeedCPU
           proc(i).PPRI = -32768
           
        End If
        proc(i).PState = "就绪"
        CurTop = GetPri(i)
   Wend
   If proc(i).PNeedCPU <= 0 Then
      proc(i).PState = "完成"
      proc(i).PCPUTime = ProcBak(i).PNeedCPU
      proc(i).PNeedCPU = 0
      CurTop = GetPri(i)
   End If
   Call Progress(i)
        
End Function
Public Function Finish()
  Dim Flag As Boolean
  Flag = True
  For i = 1 To PNum
     If (proc(i).PNeedCPU > 0) Then
       Flag = False
       Exit For         '只要还有一个进程需要时间片,未结束
     End If
  Next i
  Finish = Flag
End Function
Private Function Progress(i As Integer)   '进度条显示,进程调度序列显示
   PBar1.Visible = True
   
  PBar1.Value = 0
  Timer2.Enabled = True
  Timer2_Timer
 
  If proc(i).PNeedCPU > 0 Then
    If Round Then
      List1.AddItem proc(i).PName + "  剩余时间片:" + CStr(proc(i).PNeedCPU)
    ElseIf Priority Then
      List1.AddItem proc(i).PName + "  此次使用时间片:" + CStr(Chip)
    End If
  Else
    If Round Then
      List1.AddItem proc(i).PName + "  --完成---使用的时间片" + CStr(proc(i).PCPUTime)
    ElseIf Priority Then
      List1.AddItem proc(i).PName + "  --完成---进程原始优先级" + CStr(ProcBak(i).PPRI)
    ElseIf Fcfs.Value = True Then
      List1.AddItem proc(i).PName + "  --完成---提交时间" + CStr(ProcBak(i).PSubTime)
    End If
 End If
    List1.Selected(List1.ListCount - 1) = True
    
    
  PBar1.Value = 0
End Function

Private Sub Timer2_Timer()
  DoEvents
  If Pslice <> 0 And (PBar1.Value + 100 / Pslice) <= 100 Then
     PBar1.Value = PBar1.Value + 100 / Pslice
  Else
     PBar1.Value = 100
    Timer2.Enabled = False
  End If
End Sub


Private Function GetPri(i As Integer) '得到第一个优先级最高的进程,i为起点
   Dim TopPri As Integer
   Dim Save     As Integer
   
   Save = i
   TopPri = proc(i).PPRI
  
   For j = 1 To PNum
      If proc(i).PPRI > TopPri Then
          TopPri = proc(i).PPRI
          Save = i
     End If
     i = i + 1
     If i > PNum Then
        i = i - PNum
     End If
  
  Next j
  CurTop = Save
  GetPri = Save
End Function



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -