You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助实现VB.Net中FCFS与SJF调度算法的完成时间计算

VB.Net实现FCFS与SJF调度算法完成时间计算

1. 定义作业数据结构

先创建作业类存储核心信息及计算结果:

Public Class Job
    Public Property JobId As Integer
    Public Property ArrivalTime As Integer
    Public Property BurstTime As Integer
    Public Property CompletionTime As Integer
End Class

2. FCFS调度算法实现

按作业到达时间顺序执行,完成时间基于累加服务时间与到达时间的最大值计算:

Private Function CalculateFCFS(jobs As List(Of Job)) As List(Of Job)
    ' 按到达时间排序,时间相同则按作业ID排序
    Dim sortedJobs = jobs.OrderBy(Function(j) j.ArrivalTime).ThenBy(Function(j) j.JobId).ToList()
    Dim currentTime As Integer = 0

    For Each job In sortedJobs
        currentTime = Math.Max(currentTime, job.ArrivalTime)
        job.CompletionTime = currentTime + job.BurstTime
        currentTime = job.CompletionTime
    Next

    Return sortedJobs
End Function

3. SJF调度算法实现(非抢占式)

循环筛选当前已到达且服务时间最短的作业执行:

Private Function CalculateSJF(jobs As List(Of Job)) As List(Of Job)
    Dim remainingJobs = New List(Of Job)(jobs)
    Dim completedJobs = New List(Of Job)()
    Dim currentTime As Integer = 0

    While remainingJobs.Count > 0
        ' 筛选当前已到达的作业
        Dim availableJobs = remainingJobs.Where(Function(j) j.ArrivalTime <= currentTime).ToList()

        If availableJobs.Count = 0 Then
            ' 无已到达作业,直接跳至下一个作业的到达时间
            currentTime = remainingJobs.Min(Function(j) j.ArrivalTime)
            Continue While
        End If

        ' 优先选服务时间最短的作业,次选到达时间早的,最后选作业ID小的
        Dim selectedJob = availableJobs.OrderBy(Function(j) j.BurstTime).ThenBy(Function(j) j.ArrivalTime).ThenBy(Function(j) j.JobId).First()
        
        currentTime += selectedJob.BurstTime
        selectedJob.CompletionTime = currentTime
        
        completedJobs.Add(selectedJob)
        remainingJobs.Remove(selectedJob)
    End While

    Return completedJobs
End Function

4. GUI交互示例(匹配参考界面逻辑)

假设界面包含:

  • 输入用DataGridView(命名dgvJobs):录入作业ID、到达时间、服务时间
  • 算法触发按钮:btnFCFS(FCFS计算)、btnSJF(SJF计算)
  • 结果展示用DataGridView(命名dgvResults):显示完成时间

对应按钮点击事件代码:

Private Sub btnFCFS_Click(sender As Object, e As EventArgs) Handles btnFCFS.Click
    Dim jobs = GetJobsFromInput()
    If jobs Is Nothing Then Return

    Dim resultJobs = CalculateFCFS(jobs)
    DisplayResults(resultJobs)
End Sub

Private Sub btnSJF_Click(sender As Object, e As EventArgs) Handles btnSJF.Click
    Dim jobs = GetJobsFromInput()
    If jobs Is Nothing Then Return

    Dim resultJobs = CalculateSJF(jobs)
    DisplayResults(resultJobs)
End Sub

' 从输入表格提取作业数据并验证
Private Function GetJobsFromInput() As List(Of Job)
    Dim jobs As New List(Of Job)()
    For Each row As DataGridViewRow In dgvJobs.Rows
        If row.IsNewRow Then Continue For

        Dim jobId, arrivalTime, burstTime As Integer

        If Not Integer.TryParse(row.Cells("JobId").Value?.ToString(), jobId) Then
            MessageBox.Show("作业ID必须为整数")
            Return Nothing
        End If
        If Not Integer.TryParse(row.Cells("ArrivalTime").Value?.ToString(), arrivalTime) Then
            MessageBox.Show("到达时间必须为整数")
            Return Nothing
        End If
        If Not Integer.TryParse(row.Cells("BurstTime").Value?.ToString(), burstTime) OrElse burstTime <= 0 Then
            MessageBox.Show("服务时间必须为正整数")
            Return Nothing
        End If

        jobs.Add(New Job With {
            .JobId = jobId,
            .ArrivalTime = arrivalTime,
            .BurstTime = burstTime
        })
    Next

    If jobs.Count = 0 Then
        MessageBox.Show("请输入至少一个作业")
        Return Nothing
    End If

    Return jobs
End Function

' 将计算结果展示到表格
Private Sub DisplayResults(jobs As List(Of Job))
    dgvResults.Rows.Clear()
    dgvResults.Columns.Clear()

    dgvResults.Columns.Add("JobId", "作业ID")
    dgvResults.Columns.Add("ArrivalTime", "到达时间")
    dgvResults.Columns.Add("BurstTime", "服务时间")
    dgvResults.Columns.Add("CompletionTime", "完成时间")

    For Each job In jobs
        dgvResults.Rows.Add(job.JobId, job.ArrivalTime, job.BurstTime, job.CompletionTime)
    Next
End Sub

补充说明

  • 上述SJF为非抢占式实现,若需抢占式(短剩余时间优先),可修改为按剩余服务时间动态筛选作业
  • 可根据需求扩展输入验证逻辑,比如重复作业ID检查
  • 界面控件命名需与代码保持一致,可根据实际布局调整

内容的提问来源于stack exchange,提问作者ryzK_ean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:01:08