0

家には約 13 台のコンピューターがあり、ローカル IP で ping を実行してすべてを監視できるようにしたいと考えています。ping ターゲットをディクショナリに追加するようにプログラムをセットアップしましたが、そのディクショナリはリストビューに表示されます。

ここで、次を使用して IP に ping を実行します。

    Dim MyPing As New System.Net.NetworkInformation.Ping
    Dim Myreply As System.Net.NetworkInformation.PingReply = MyPing.Send("192.168.1.10")
    MsgBox(Myreply.RoundtripTime)

IP からの応答を取得するか、タイムアウトになるまで、プログラムを遅延させます。これを回避するには、個別のスレッドで各 IP に ping を実行し、デリゲートを使用して辞書の結果を更新する必要があることを知っています。

スレッドとデリゲートの使用に関する多くのチュートリアルを理解しようとしましたが、それらがどのように機能するかを完全に理解することはできません.2つのパラメーターをこの新しいスレッドに渡して情報を更新できるようにする非常に簡単な例が必要です. UIスレッドで(私の辞書にあります)。

ただし、スレッドとデリゲートを理解しようとした後、数か月前にチュートリアルからパッチを適用し、最終的にあきらめました。しかし、1 つのパラメーターしか渡すことができず、その場で ping を実行するスレッドを作成しているときに機能するかどうかはわかりません。さらに、私はそれがどのように機能するかを本当に理解しておらず、私の人生でそれを変更することができませんでした.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim t1 As New Threading.Thread(AddressOf Count)
    t1.IsBackground = True
    t1.Start(100)
End Sub


Private Sub Count(ByVal Max As Integer)
    For i = 1 To Max
        SetLabelText(i.ToString())
        Threading.Thread.Sleep(50)
    Next
End Sub


Private Sub SetLabelText(ByVal text As String)
    If Label1.InvokeRequired Then
        Label1.Invoke(New Action(Of String)(AddressOf SetLabelText), text)
    Else
        Label1.Text = text

    End If
End Sub

私が見たもののいくつか:

http://www.developerfusion.com/article/5251/delegates-in-vbnet/

http://www.tek-tips.com/faqs.cfm?fid=6036

http://timhastings.co.uk/2011/09/vb-net-using-delegates-for-form-updates-from-worker-threads/

http://www.youtube.com/watch?v=h-DQywCJ_wY

要約すると、別のスレッドで IP に ping を実行し、ping の結果 (IE: タイムアウト、ラウンドトリップ) で辞書の値を変更する必要があります。また、辞書を更新する必要があるため、スレッドに 2 つのパラメーターを渡す必要があります。IP と、ユーザーがそのコンピューターに対して作成する一意の名前です。誰かが私を正しい方向に向けたり、学ぼうとすることができる非常に単純な例を提供したりできますか?

4

1 に答える 1

1

いくつかの非常に大雑把なアイデア。

Class pingObj
    Property addr As Net.IPAddress
    Property idx As Integer
End Class

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ListBox1.Items.Clear()
    'ips to ping
    Dim ips As New List(Of String)({"192.168.1.1", "192.168.1.5", "192.168.1.6"})
    For Each i As String In ips
        ListBox1.Items.Add(i)
        Dim foo As New pingObj
        foo.addr = Net.IPAddress.Parse(i)
        foo.idx = ListBox1.Items.Count - 1
        Dim t As New Threading.Thread(AddressOf pingem)
        t.IsBackground = True
        t.Start(foo)
    Next
End Sub

Private Sub pingem(p As Object)
    Dim pobj As pingObj = DirectCast(p, pingObj)
    Dim MyPing As New System.Net.NetworkInformation.Ping
    Do
        Dim Myreply As System.Net.NetworkInformation.PingReply = MyPing.Send(pobj.addr)
        Me.Invoke(Sub() ListBox1.Items.Item(pobj.idx) = String.Format("{0} - {1}", _
                                                                     Myreply.Address.ToString, Myreply.RoundtripTime.ToString))
        Threading.Thread.Sleep(1000)
    Loop

End Sub
于 2013-07-26T18:10:53.477 に答える