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

📄 form1.vb

📁 实进程调度(高响应比优先调度)的功能
💻 VB
字号:
Public Class Form1
    Public Structure process                     '定义进程的数据结构
        Dim proname As String
        Dim createtime As String
        Dim proid As Integer
        Dim allneedtime As Integer
        Dim waittime As Integer
        Dim flishtime As Integer
    End Structure
    Public h As Integer = 0
    Public runing, maxsignal As process        '定义就绪、阻塞进程队列和正在执行进程、需要唤醒进程数据结构
    Public wait(9), signal(9) As process
    Sub tianjia()                              '添加进程
        Dim i, j, k As Integer
        Dim n, p As String
        Dim m As Double
        Dim d As Date = Date.Now
        Dim s As String = d.ToLongTimeString()
        j = 10
        For i = 0 To 9
            If wait(i).proid <> 0 Then
                j -= 1
            End If
        Next
        If j = 0 Then
            MsgBox("注意!" & Chr(10) & "就绪队列已满,不能再添加进程!", MsgBoxStyle.OkOnly, "警告!")
            TextBox1.Text = ""
            TextBox3.Text = ""
            Exit Sub
        Else
            For i = 0 To 9
                If wait(i).proid = 0 Then
                    p = TextBox1.Text
                    n = TextBox3.Text
                    m = Val(n)
                    k = m \ 2
                    j = (m + 1) \ 2
                    If TextBox1.Text = "" Then
                        MsgBox("注意!" & Chr(10) & "进程名不能为空,请重输!", MsgBoxStyle.OkOnly, "错误!")
                        TextBox1.Text = ""
                        TextBox3.Text = ""
                        TextBox1.Focus()
                        Exit Sub
                    ElseIf Len(p) > 8 Then
                        MsgBox("注意!" & Chr(10) & "进程名长度不能长于8,请重输1~8长度的进程名!", MsgBoxStyle.OkOnly, "错误!")
                        TextBox1.Text = ""
                        TextBox3.Text = ""
                        TextBox1.Focus()
                        Exit Sub
                    ElseIf TextBox3.Text = "" Then
                        MsgBox("注意!" & Chr(10) & "进程执行时间不能为空,请重输!", MsgBoxStyle.OkOnly, "错误!")
                        TextBox3.Text = ""
                        TextBox3.Focus()
                        Exit Sub
                    ElseIf m > 1000000000 Then
                        MsgBox("注意!" & Chr(10) & "进程执行时间超出范围,请重输!", MsgBoxStyle.OkOnly, "错误!")
                        TextBox3.Text = ""
                        TextBox3.Focus()
                        Exit Sub
                    ElseIf (k * 2 = m Or j * 2 = m + 1) And m > 0 Then
                        wait(i).proname = TextBox1.Text
                        wait(i).createtime = s
                        wait(i).allneedtime = m
                        h += 1
                        wait(i).proid = h
                        TextBox1.Text = ""
                        TextBox3.Text = ""
                    Else
                        MsgBox("注意!" & Chr(10) & "进程执行时间必须是大于零的整数,请重输!", MsgBoxStyle.OkOnly, "错误!")
                        TextBox3.Text = ""
                        TextBox3.Focus()
                        Exit Sub
                    End If
                    Exit For
                End If
            Next
        End If
        If TextBox5.Text = "" Then
            zhixing()
        Else
            MsgBox("注意!" & Chr(10) & "已有进程正在执行,进程被系统插入就绪队列!", MsgBoxStyle.OkOnly, "提示!")
            Exit Sub
        End If
        Timer2.Start()
    End Sub
    Sub zhixing()                     '启动执行进程
        Dim i, j As Integer
        j = 10
        For i = 0 To 9
            If wait(i).proid = 0 Then
                j -= 1
            End If
        Next
        If j = 0 Then
            TextBox4.Text = "所有的就绪进程都已执行完了,请添加进程、唤醒阻塞进程或退出程序!"
            Exit Sub
        Else
            maxwait()
            jiuxu()
            TextBox5.Text = "进程:" + runing.proname + ".exe  进程标示符:" + runing.proid.ToString + "  创建时间:" + runing.createtime + "  需要运行时间:" + runing.allneedtime.ToString + "秒  已运行时间:" + runing.flishtime.ToString + "秒。" + vbCrLf
            Timer1.Start()
        End If
    End Sub
    Sub maxwait()                    '请最高响应比度的就绪进程
        Dim i, j As Integer
        Dim max, n As Double
        For i = 0 To 9
            If wait(i).proid <> 0 Then
                j += 1
                max = (wait(i).allneedtime - wait(i).flishtime + wait(i).waittime) / wait(i).allneedtime
                runing = wait(i)
                Exit For
            End If
        Next
        For i = j To 9
            If wait(i).proid <> 0 Then
                n = (wait(i).allneedtime - wait(i).flishtime + wait(i).waittime) / wait(i).allneedtime
                If max >= n Then
                    max = max
                Else
                    max = n
                    runing = wait(i)
                End If
            End If
        Next
        For i = 0 To 9
            If runing.proid = wait(i).proid Then
                wait(i).allneedtime = 0
                wait(i).createtime = ""
                wait(i).flishtime = 0
                wait(i).proid = 0
                wait(i).proname = ""
                wait(i).waittime = 0
                Exit For
            End If
        Next
    End Sub
    Sub jiuxu()                     '显示就绪进程
        Dim i As Integer
        TextBox4.Text = ""
        For i = 0 To 9
            If wait(i).proid <> 0 Then
                wait(i).waittime += 1
                TextBox4.Text += "进程:" + wait(i).proname + ".exe  进程标示符:" + wait(i).proid.ToString + "  创建时间:" + wait(i).createtime + "  总需运行时间:" + wait(i).allneedtime.ToString + "秒 等待时间:" + wait(i).waittime.ToString + "秒  已运行时间:" + wait(i).flishtime.ToString + "秒。" + vbCrLf
            End If
        Next
    End Sub
    Sub yunxing()                  '运行正在执行进程
        runing.flishtime += 1
        TextBox5.Text = "进程:" + runing.proname + ".exe  进程标示符:" + runing.proid.ToString + "  创建时间:" + runing.createtime + "  需要运行时间:" + runing.allneedtime.ToString + "秒  已运行时间:" + runing.flishtime.ToString + "秒。" + vbCrLf
        If runing.allneedtime = runing.flishtime Then
            flish()
            TextBox5.Text = ""
            Timer1.Stop()
            zhixing()
        End If
    End Sub
    Sub flish()                   '显示完成进程
        TextBox6.Text += "进程:" + runing.proname + ".exe  进程标示符:" + runing.proid.ToString + "  创建时间:" + runing.createtime + "  需要运行时间:" + runing.allneedtime.ToString + "秒  已运行时间:" + runing.flishtime.ToString + "秒。" + vbCrLf
        runing.allneedtime = 0
        runing.createtime = ""
        runing.waittime = 0
        runing.flishtime = 0
        runing.proid = 0
        runing.proname = ""
    End Sub
    Sub zusai()                  '阻塞正在执行进程
        Dim i, j As Integer
        If TextBox5.Text = "" Then
            MsgBox("注意!" & Chr(10) & "当前没有正在执行的进程,不能阻塞正在执行的进程!", MsgBoxStyle.OkOnly, "错误!")
            Exit Sub
        End If
        j = 10
        For i = 0 To 9
            If signal(i).proid <> 0 Then
                j -= 1
            End If
        Next
        If j = 0 Then
            MsgBox("注意!" & Chr(10) & "阻塞队列已满,不能再添加到阻塞队列!", MsgBoxStyle.OkOnly, "警告!")
            Exit Sub
        Else
            For i = 0 To 9
                If signal(i).proid = 0 Then
                    signal(i) = runing
                    signal(i).waittime = 0
                    Exit For
                End If
            Next
            Timer1.Stop()
            signalpro()
            TextBox5.Text = ""
            zhixing()
        End If
    End Sub
    Sub signalpro()             '显示阻塞进程
        Dim i As Integer
        TextBox7.Text = ""
        For i = 0 To 9
            If signal(i).proid <> 0 Then
                signal(i).waittime += 1
                TextBox7.Text += "进程:" + signal(i).proname + ".exe  进程标示符:" + signal(i).proid.ToString + "  创建时间:" + signal(i).createtime + "  总需运行时间:" + signal(i).allneedtime.ToString + "秒 等待时间:" + signal(i).waittime.ToString + "秒  已运行时间:" + signal(i).flishtime.ToString + "秒。" + vbCrLf
            End If
        Next
    End Sub
    Sub huanxing()              '唤醒阻塞进程
        Dim i, j, k As Integer
        j = 10
        For i = 0 To 9
            If wait(i).proid <> 0 Then
                j -= 1
            End If
        Next
        k = 10
        For i = 0 To 9
            If signal(i).proid = 0 Then
                k -= 1
            End If
        Next
        If k = 0 Then
            MsgBox("注意!" & Chr(10) & "阻塞队列已空,不能再唤醒阻塞进程!", MsgBoxStyle.OkOnly, "警告!")
        ElseIf j = 0 Then
            MsgBox("注意!" & Chr(10) & "就绪队列已满,不能再唤醒阻塞进程!", MsgBoxStyle.OkOnly, "警告!")
        Else
            signalwait()
            For i = 0 To 9
                If wait(i).proid = 0 Then
                    wait(i) = maxsignal
                    wait(i).waittime = 0
                    Exit For
                End If
            Next
            For i = 0 To 9
                If maxsignal.proid = signal(i).proid Then
                    signal(i).allneedtime = 0
                    signal(i).createtime = ""
                    signal(i).flishtime = 0
                    signal(i).proid = 0
                    signal(i).proname = ""
                    signal(i).waittime = 0
                    Exit For
                End If
            Next
            jiuxu()
            signalpro()
        End If
        If TextBox5.Text = "" Then
            zhixing()
        End If
    End Sub
    Sub signalwait()             '求最高响应比度的阻塞进程
        Dim i, j As Integer
        Dim max, n As Double
        For i = 0 To 9
            If signal(i).proid <> 0 Then
                j += 1
                max = (signal(i).allneedtime - signal(i).flishtime + signal(i).waittime) / wait(i).allneedtime
                maxsignal = signal(i)
                Exit For
            End If
        Next
        For i = j To 9
            If signal(i).proid <> 0 Then
                n = (signal(i).allneedtime - signal(i).flishtime + signal(i).waittime) / wait(i).allneedtime
                If max >= n Then
                    max = max
                Else
                    max = n
                    maxsignal = signal(i)
                End If
            End If
        Next
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        tianjia()
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer               '初始化就绪和阻塞队列
        runing.allneedtime = 0
        runing.waittime = 0
        runing.createtime = ""
        runing.flishtime = 0
        runing.proid = 0
        runing.proname = ""
        maxsignal.allneedtime = 0
        maxsignal.waittime = 0
        maxsignal.createtime = ""
        maxsignal.flishtime = 0
        maxsignal.proid = 0
        maxsignal.proname = ""
        For i = 0 To 9
            wait(i).allneedtime = 0
            wait(i).createtime = ""
            wait(i).flishtime = 0
            wait(i).proid = 0
            wait(i).proname = ""
            wait(i).waittime = 0
            signal(i).allneedtime = 0
            signal(i).createtime = ""
            signal(i).flishtime = 0
            signal(i).proid = 0
            signal(i).proname = ""
            signal(i).waittime = 0
        Next
    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        huanxing()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        zusai()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        yunxing()
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        jiuxu()
        signalpro()
    End Sub
End Class

⌨️ 快捷键说明

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