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

📄 form1.frm

📁 是一个进程调度的程序
💻 FRM
📖 第 1 页 / 共 3 页
字号:
      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 + -