微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两个类之间的非法跨线程操作无法区分线程来解决问题

如何解决两个类之间的非法跨线程操作无法区分线程来解决问题

我编写了一个小程序,它允许两个用户输入(开始和停止)、一个开始按钮和一个进度条。这是实际程序的精简修改版本,其内容刚好足以显示错误。我想保留表单中的所有用户输入,以及在它自己的类中执行实际工作的所有代码。尝试更新进度条时返回错误。我认为问题可能源于这样一个事实,即我的 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 举报,一经查实,本站将立刻删除。