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 に答える