tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^5: Form_Loadイベント
投稿日: 2007/12/15(Sat) 09:16
投稿者魔界の仮面弁士
> やってみましたが、上記のコード内でLabelのTextプロパティを設定すると

DoWork(ワーカースレッド)から、フォームやコントロールといった
メインスレッドのオブジェクトを操作する事はできません。

# コントロールだけでなく、たとえば Private a As Integer のような、
# 単純な変数の読み書きさえ、基本的には NG です。
## 変数を排他ロックしたり、System.Threading.Interlocked にて
## 読み書きするならば安全ですが。

非同期処理の途中経過を表示したい場合は、ReportProgress メソッドを用います。


Public Class Form1
 Private Sub Form1_Load(……
  '進捗確認を行えるようにしておく。
  Me.BackgroundWorker1.WorkerReportsProgress = True

  'ついでに、キャンセルも行えるようにしてみる。
  Me.BackgroundWorker1.WorkerSupportsCancellation = True
  Me.Button1.Text = "キャンセル"

  '処理開始
  Me.BackgroundWorker1.RunWorkerAsync()
 End Sub

 '★ 途中経過を受け取るためのイベント ★
 Private Sub BackgroundWorker1_ProgressChanged(……
  '状況がイベントとして通知されるので、
  'ProgressPercentage (進捗のパーセンテージ)か
  'UserState (状況を表す任意のデータ)を受け取り、表示する。
  Me.Label1.Text = CStr(e.UserState)
 End Sub

 Private Sub Button1_Click(……
  Me.Button1.Enabled = False
  'キャンセル処理をさせたい時には、このメソッド。
  Me.BackgroundWorker1.CancelAsync()
 End Sub

 Private Sub BackgroundWorker1_DoWork(……
  Dim bgw As System.ComponentModel.BackgroundWorker
  bgw = DirectCast(sender, System.ComponentModel.BackgroundWorker)

  For n As Integer = 0 To 100
   '進捗報告
   Dim state As Object = "現在" & CStr(n) & "%です。"
   bgw.ReportProgress(n, state) '★ 途中経過を報告するためのメソッド ★

   '時間のかかる処理
   System.Threading.Thread.Sleep(100) '0.1秒待機

   'キャンセルが要求されたか?
   If bgw.CancellationPending Then
    e.Cancel = True
    Return
   End If
  Next

  e.Result = "結果"
 End Sub

 Private Sub BackgroundWorker1_RunWorkerCompleted1(……
  '結果表示
  If e.Error IsNot Nothing Then
   Me.Label2.Text = "処理中にエラー発生:" & e.Error.Message
  ElseIf e.Cancelled Then
   Me.Label2.Text = "ユーザー操作によってキャンセルされました。"
  Else
   Me.Label2.Text = CStr(e.Result)
  End If
 End Sub
End Class

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。