如何解决两个类之间的非法跨线程操作无法区分线程来解决问题
我编写了一个小程序,它允许两个用户输入(开始和停止)、一个开始按钮和一个进度条。这是实际程序的精简修改版本,其内容刚好足以显示错误。我想保留表单中的所有用户输入,以及在它自己的类中执行实际工作的所有代码。尝试更新进度条时返回错误。我认为问题可能源于这样一个事实,即我的 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
结束课程
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。