多线程上的vb.net ping
我家里大约有13台电脑,我想通过本地IP ping来监控它们。我设置了一个程序,将ping目标添加到字典中,该字典显示在列表视图中 现在,当我去平安IP时,使用:多线程上的vb.net ping,vb.net,multithreading,delegates,ping,Vb.net,Multithreading,Delegates,Ping,我家里大约有13台电脑,我想通过本地IP ping来监控它们。我设置了一个程序,将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.Rou
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 on时它是否有效。另外,我真的不明白它是如何工作的,我无法用我的一生来修改它
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
我看了两件事:
总之,我需要在一个单独的线程上ping一个IP,然后用ping的结果更改字典中的一个值(即:超时,往返)。
因为我需要更新字典,所以我需要将两个参数传递到线程中,一个IP和用户为该计算机生成的唯一名称。谁能给我指出正确的方向,或者提供一个超级简单的例子,让我从中学习一些非常粗略的想法
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
这是有道理的,但是你能解释一下最后一个子节点吗?我不太明白它是如何工作的。是线程执行实际的ping操作。放入一些ip并在睡眠中添加断点。看看这些变量,它应该更有意义。很抱歉响应延迟,但你是对的。我剖析了它,并将它合并到我的项目中,我现在理解了它,它工作得很好。谢谢你,我会尽可能选择最好的答案。不过我有一个奇怪的问题。我已经对上面的代码做了相当多的修改,但已经足够相似了。假设我从线程中删除了一些内容,它会给我一个错误,我不确定如何“停止”线程(我知道你不应该这样做)。如果我要从列表视图中删除一些内容,我会怎么做?也许你应该用你的代码开始一个新的问题,然后问你的问题。