0

我有一个我编写的小程序,它允许两个用户输入(开始和停止)、一个开始按钮和一个进度条。这是实际程序的精简修改版本,其内容足以显示错误。我想将所有用户输入保留在表单中,并且所有代码都在它自己的类中进行实际工作。尝试更新进度条时返回错误。我认为问题可能源于我的 bgw 实际上是从工作类调用一个方法而不是包含代码本身。下面我展示了表单代码,然后是 clsTask 代码。我很难理解它的多线程方面。有没有办法从表单中更新进度条,还是我需要完全重组?

Imports System.ComponentModel

Public Class Form1

Private T As clsTask
Private twodcalPointsToCapture As Integer
Private pointsCaptured As Integer

Private Sub init() Handles Me.Load

    'System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False     'WHAT WE'RE TRYING NOT TO DO

    T = New clsTask

    AddHandler T.UpdateProgress, AddressOf HandleProgressUpdate
    AddHandler T.UpdateTotalPointCount, AddressOf SetProgressBarTotal

End Sub

Private Sub SetProgressBarTotal(pointCount As Integer)

    twodcalPointsToCapture = pointCount

End Sub

Private Sub btnStartCal_Click(sender As Object, e As EventArgs) Handles btnStartCal.Click

    T.startFreq = CInt(numStart.Text)
    T.stopFreq = CInt(numStop.Text)

    disableInputs()

    BackgroundWorker1.RunWorkerAsync()

End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    T.Start()

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

    enableInputs()

End Sub

Sub enableInputs()

    btnStartCal.Enabled = True
    numStart.Enabled = True
    numStart.Enabled = True

End Sub

Sub disableInputs()

    btnStartCal.Enabled = False
    numStart.Enabled = False
    numStart.Enabled = False

End Sub

Private Sub HandleProgressUpdate()

    pointsCaptured += 1
    Dim value As Integer
    value = CInt((pointsCaptured / twodcalPointsToCapture) * 100)
    ProgressBar1.Value = value
    numCount.Text = CStr(value)

End Sub

Private Sub BackgroundWorker2_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker2.ProgressChanged

    'ProgressBar1.Value = e.ProgressPercentage

End Sub

End Class

分频器

Imports System.ComponentModel
Imports System.IO
Imports System.Threading

Public Class clsTask

Public Event UpdateTotalPointCount(pointsToCapture As Integer)
Public Event UpdateProgress()
Public Property startFreq As Single
Public Property stopFreq As Single

Public Sub Start()

    RaiseEvent UpdateTotalPointCount(calctotalpoints())

    performTask()

End Sub

Public Function calctotalpoints() As Integer

    Dim numPoints As Integer

    numPoints = CInt(stopFreq - startFreq)
    Return numPoints

End Function

Sub performTask()

    For frequency As Single = startFreq To stopFreq

        Threading.Thread.Sleep(1000)
        RaiseEvent UpdateProgress()

        If frequency = stopFreq Then
            MsgBox("Complete!")
        End If

    Next

End Sub

结束类

4

0 回答 0