0

我正在尝试使用线程访问一些组件。我的表格如下所示:

在此处输入图像描述

我的来源看起来像这样:

   Private Sub btnGO_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGO.Click
      pbAction.Value = 0
      bgwProcess.RunWorkerAsync()
      Me.Cursor = Cursors.WaitCursor
   End Sub

   Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
      Application.Exit()
   End Sub

   Private Sub bgwProcess_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwProcess.DoWork
      'a job consists in retrieving data, populating a listview and update the progressbar
      'start job 1.1
      'do job 1.1 -> ProgressBar1.value+=1
      'do job 1.2 -> ProgressBar1.value+=1
      'do job 1.3 -> ProgressBar1.value+=1

      'start job 2.1 ProgressBar1.value=1
      'do job 2.1 -> ProgressBar2.value+=1
      'do job 2.2 -> ProgressBar1.value+=1

   End Sub

   Private Sub bgwProcess_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwProcess.RunWorkerCompleted
      Me.Cursor = Cursors.Default
   End Sub

谁能帮我吗?

4

1 回答 1

0

我创建了一个在 _doWork 中填充的类,并将其发送到 _ProgressChanged 过程,在那里我可以对表单上的组件做任何我想做的事情:

Public Class myObj
      Public action As String
      Public msg As String
      Public pbAction As Integer
      Public pbMsg As Integer
   End Class

...

   Private Sub btnGO_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGO.Click
      bgwProcess.RunWorkerAsync()
      Me.Cursor = Cursors.WaitCursor
   End Sub

   Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
      Application.Exit()
   End Sub

   Private Sub bgwProcess_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwProcess.DoWork
      Dim op As New myObj

      op.action = "my action"
      op.msg = "My result: Done"
      op.pbAction = 1
      op.pbMsg = 1
      bgwProcess.ReportProgress(0, op)

   End Sub

   Private Sub bgwProcess_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwProcess.ProgressChanged
      Dim obj As New myObj
      obj = DirectCast(e.UserState, myObj)

      myListView.BeginUpdate()
      Dim li As New ListViewItem(obj.action, 0)
      li.SubItems.Add(obj.msg)

      myListView.Items.AddRange(New ListViewItem() {li})
      myListView.EndUpdate()
      myListView.EnsureVisible(myListView.Items.Count - 1)
      myListView.Refresh()

      pbAction.Value = obj.pbAction
      pbTotal.Value = obj.pbMsg
   End Sub

   Private Sub bgwProcess_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwProcess.RunWorkerCompleted
      Me.Cursor = Cursors.Default
   End Sub
于 2012-04-23T00:13:07.170 回答