2013-07-26 65 views
0

我家有大約13臺計算機,我希望能夠通過用本地IP ping它們來監視它們。我有一個程序設置爲將ping目標添加到字典中,並且該字典顯示在列表視圖中。vb.net在多個線程上pinging

現在,當我去ping一個IP,使用:

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的響應,或者直到超時。我知道我需要在單獨的線程上ping每個IP來避免這種情況,並使用委託在我的字典中更新結果。我試圖瞭解許多關於使用線程和委託的教程,但我不明白它們是如何工作的,我需要一個非常簡單的例子,它允許我將2個參數傳遞到這個新線程中,並且然後在UI線程上更新我的信息(在我的字典中)。

但是,在嘗試理解線程和代表之後,我在幾個月前從一兩個教程中將它修補到一起,最終放棄了。但是它只允許你傳遞一個參數,而且我不確定當我正在進行線程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

因此,在總結,我需要來ping一個IP在一個單獨的線程上,然後使用ping的結果(IE:超時,往返)更改我的字典中的值。 因爲我需要更新字典,所以我需要將兩個參數傳遞給線程,一個IP和用戶爲該計算機創建的唯一名稱。任何人都可以向我指出正確的方向或提供一個我可以嘗試從中學習的超級簡單例子嗎?

回答

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 
+0

這是有道理的,但你能解釋最後一個子,我不太明白它是如何工作的。 – Postman

+0

這是執行ping操作的線程。把你的一些ip放入並在睡眠中添加一個斷點。看看變量,它應該更有意義。 – dbasnett

+0

對不起,延遲的迴應,但你是對的。我解剖了它並將其合併到我的項目中,現在我明白了,它效果很好。謝謝你,會盡我所能選擇最佳答案。 – Postman