2013-07-26 4 views
0

나는 내 집에 약 13 대의 컴퓨터가 있으며 로컬 IP로 핑 (ping)하여 모든 것을 모니터 할 수 있기를 원합니다. 나는 ping 대상을 사전에 추가하도록 설정된 프로그램을 가지고 있으며 그 사전은 listview에 표시됩니다.vb.net 여러 스레드에서 pinging

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)로 이동합니다. 이 문제를 피하기 위해 별도의 스레드에서 각 IP에 ping을 수행하고 대리자를 사용하여 사전에 결과를 업데이트해야한다는 것을 알고 있습니다.

스레드와 대리자 사용에 대한 많은 자습서를 이해하려고했지만 실제로 작동하는 방식을 이해할 수 없습니다.이 새로운 스레드에 2 개의 매개 변수를 전달할 수있는 간단한 예제가 필요합니다. 그런 다음 내 사전의 UI 스레드에서 내 정보를 업데이트합니다.

그러나 스레드와 대리자를 이해하고 결국 포기한 후 몇 달 전에 튜토리얼 또는 2 개에서 함께 패치했습니다. 그러나 하나의 매개 변수 만 전달할 수 있으며, 즉석에서 스레드를 핑 (ping) 할 때 작동하는지 잘 모르겠습니다. 게다가, 나는 그것이 어떻게 작동하는지 정말로 이해하지 못하고, 내 인생을 위해 그것을 수정할 수 없었다.

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

그래서 요약, 내가 핑해야합니다

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 

것들 중 몇은 내가 검토 한 별도의 스레드에 IP를 저장 한 다음 ping 결과 (IE : timeout, roundtrip)로 사전에 값을 변경하십시오. 그리고 사전을 업데이트해야하기 때문에 스레드에 두 개의 매개 변수, 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의 일부를 넣고 sleep에 breakpoint를 추가하십시오. 변수를 살펴보면 더 이해할 수 있습니다. – dbasnett

+0

응답이 늦어 져 죄송 합니다만, 귀하는 옳았습니다. 나는 그것을 해부하고 그것을 나의 프로젝트에 합병했다, 나는 그것을 지금 이해한다. 그리고 그것은 잘 작동한다. 할 수있을 때 최선의 답을 고를 것입니다. – Postman