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

📄 frm_main.frm

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