uso de threads

31/10/2006 - 12:55 por XiScO | Informe spam
hola!
Resulta que en mi aplicacion quiero hacer un ping a varios pcs para ver si
estan encendidos, como eso toma su tiempo, estoy intentando usar threads.
El caso es que desde la aplicacion principal al pulsar un boton queria
hacer un thread de un metodo y que despues llenase un listview con la
informacion obtenida.
El caso es que me daba errores de los objetos que no eran static o algo asi,
asi que he creado una clase dentro de la clase principal y en el
constructor le paso los parametros (ip inicial y final), pero al pasarle el
listview no me funciona. Como puedo hacer para que el thread llene datos
del listview de la aplicacion?
Bueno, me he liado un poco, pero espero que sepais que pregunto ;)
Salu2
 

Leer las respuestas

#1 Jesús López
01/11/2006 - 21:43 | Informe spam
No es necesario usar hilos en este caso ya que la clase Ping implementa el
nuevo patrón de llamada asíncrona introducido en .NET Framework 2.0. Es
decir, la clase Ping tiene el método SendAsync el cual realiza el ping en
segudo plano. Además incluye el evento PingCompleted, que como cualquier
clase que implementa este patrón, el procedimiento de evento se ejecuta
sincronizado, lo cual significa que no tienes que usar ningún tipo de
sincronización como Control.Invoke o Control.BeginInvoke.

Suponiendo que el ListView tiene las columnas:

Host
Address
Status
Time

Y tenemos un botón "SendPingsButton". Este sería un ejemplo de código que
hace un ping asíncrono a una serie de Hosts:

Imports System.Net
Imports System.Net.NetworkInformation

Public Class Form1

Private Sub SendPingsButton_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles SendPingsButton.Click
' los hosts pueden ser direcciones IP o nombres de host
Dim hosts As String() = {"127.0.0.1", "192.168.1.3", "localhost",
"192.168.1.1", _
"192.168.1.10", "pt", "www.google.com",
"www.microsoft.com"}
SendPings(hosts)
End Sub

Sub SendPings(ByVal hosts As String())
Dim ping As Ping = Nothing
For Each host As String In hosts
ping = New Ping()
AddHandler ping.PingCompleted, AddressOf ping_PingCompleted
ping.SendAsync(host, 5000, host)
Next
End Sub

Private Sub ping_PingCompleted(ByVal sender As Object, ByVal e As
System.Net.NetworkInformation.PingCompletedEventArgs)
Dim Host As String = DirectCast(e.UserState, String)
Dim Address As String = e.Reply.Address.ToString()
Dim Status As String = e.Reply.Status.ToString()
Dim Time As String = e.Reply.RoundtripTime.ToString() + " ms"

Dim item As New ListViewItem(Host)
item.SubItems.Add(Address)
item.SubItems.Add(Status)
item.SubItems.Add(Time)
Me.PingResultsListView.Items.Add(item)

Dim ping As Ping = DirectCast(sender, Ping)
ping.Dispose()
End Sub

End Class

Al ejecutar este ejemplo me da

host address Status Time
www.google.com 209.85.129.104 Success 76 ms
www.microsoft.com 207.46.19.30 TimeOut 0 ms

Observa que aunque www.microsoft.com da TimeOut, ha resuelto la dirección
IP, pero no ha respondido porque Microsoft tiene filtrado el tráfico ICMP.


Saludos:

Jesús López





"XiScO" escribió en el mensaje
news:eiyI5LO$
hola!
Resulta que en mi aplicacion quiero hacer un ping a varios pcs para ver si
estan encendidos, como eso toma su tiempo, estoy intentando usar threads.
El caso es que desde la aplicacion principal al pulsar un boton queria
hacer un thread de un metodo y que despues llenase un listview con la
informacion obtenida.
El caso es que me daba errores de los objetos que no eran static o algo
asi,
asi que he creado una clase dentro de la clase principal y en el
constructor le paso los parametros (ip inicial y final), pero al pasarle
el
listview no me funciona. Como puedo hacer para que el thread llene datos
del listview de la aplicacion?
Bueno, me he liado un poco, pero espero que sepais que pregunto ;)
Salu2

Preguntas similares