2008年06月16日

BackGroundWorkerでのバックグラウンド処理。 (参考コード)

BackgroundWorkerを使ったバックグラウンド処理です。

「BackGroundWorkerでのバックグラウンド処理(つまづき→解決 編)」では、別スレッドからコントロールを操作する手段をご紹介しました。

今回は、それを元にちょっとしたプログラムを作成してみました。

内容は、ネットワーク上のコンピュータのホスト名を巡回して検索し、リストボックスに表示させるというものです。

バックグラウンド処理のテストとして作ったので、エラー処理などはきちんと施されていません。
参考程度までに。。。。

>>>


>>>

sample039-1.jpg
クリックすれば拡大します。

上図のように、ボタンとリストボックスを配置します。
また、BackgroundWorkerコンポーネントも配置します。


「Start」ボタンをクリックすると、ネットワークの巡回を開始します。
「Cancel」ボタンをクリックすると、スレッド処理を中断します。

なお、ネットワークは192.168.10.0/255.255.255.0としています。
192.168.10.1から192.168.10.254までを一つ一つ調べ、ホスト名の解決を行います。
ホスト名の取得には、System.Net.Dns.GetHostEntryを使用しています。
また、最初にPingにてチェックを行い、PingがNGの場合はホスト名の取得を行わないようにしています。
(My.Computer.Network.Ping)

BackgroundWorkerでバックグラウンド処理でキャンセルをさせたい場合、キャンセルを受け付けるように指定する必要があります。
配置したBackgroundWorker「WorkerSupportCancellation」プロパティ「True」に変更します。(デフォルトはFalse)

キャンセルを実行するには、BackgroundWorker1.CancelAsync()メソッドを呼び出します。

バックグラウンド処理がキャンセルされたかどうかは、DoWorkイベント内で逐一チェックを行います。
キャンセルされた場合はBackgroundWorker1.CancellationPendingTrueになりますので、Trueの場合の処理を実行することで、キャンセルさせることが可能となります。


<コード>
===========================================
Public Class Form1

  'デリゲートを宣言します。
  '文字列を受け取るAddListBoxTextというデリゲートとします。

  Delegate Sub AddListBoxText(ByVal str As String)

  'リストボックスに文字列を挿入するメソッドです。
  'リストボックスのInvokeRequiredで、別のスレッドから
  'アクセスされたかどうかを判断し、Trueである場合とFalse
  'の場合の処理を記述します。
  Private Sub AddItem(ByVal str As String)
    '別スレッドからのアクセスかどうかの判断。
    If ListBox1.InvokeRequired = True Then
      'Invokeでデリゲートを呼び出します。
      '第1引数にデリゲートを直接記述。(Newでコンストラクタ)
      '第2引数に、渡す文字列
      Me.Invoke(New AddListBoxText(AddressOf AddItem), str)
    Else

      ListBox1.Items.Add(str)

    End If

  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    'バックグラウンド処理の実行。
    BackgroundWorker1.RunWorkerAsync()
  End Sub


  Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    Dim i As Integer

    '192.168.10.1から192.168.10.254までを巡回
    For i = 1 To 254
      'バックグラウンドがキャンセルされたかどうかを確認。
      If BackgroundWorker1.CancellationPending = True Then

        Exit Sub

      End If
      'まずはPingで確認を行う。
      If My.Computer.Network.Ping("192.168.10." & i) = True Then
        'AddItemメソッドで、リストボックスに値追加。
        AddItem("192.168.10." & i & ControlChars.Tab & _
System.Net.Dns.GetHostEntry("192.168.0." & i).HostName.ToString)

      Else
        'PingNGの場合、ホスト名はX
        AddItem("192.168.10." & i & ControlChars.Tab & "X")

      End If

      Threading.Thread.Sleep(10)

    Next

  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    'バックグラウンド処理のキャンセル実行。
    BackgroundWorker1.CancelAsync()

  End Sub

End Class
===========================================


実行結果は以下の通りです。
sample039-2.jpg
クリックすれば拡大します。
※途中でキャンセルしています。

バックグラウンドで巡回し、ホスト名をリストアップしてくれます。



posted by Debring at 12:01 | Comment(0) | TrackBack(0) | VB2005 スレッド処理
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。