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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 XiScO
03/11/2006 - 14:24 | Informe spam
Voy a probarlo, gracias. Pero podre lanzar 20 o mas ping seguidos?
Salu2
Jesús López wrote:

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
Respuesta Responder a este mensaje
#3 Jesús López
03/11/2006 - 17:56 | Informe spam
como si son 200.
Respuesta Responder a este mensaje
#4 XiScO
06/11/2006 - 11:30 | Informe spam
Nada, nada no me hagas caso, es que no lei bien tu post y me puese a probar
yo sin mirar tu codigo. Cuando lanzaba un ping nuevo me decia que estaba
otro en curso, pero ya esta solucionado.
Solo una pequeña cuestion, si lanzo 20 pings, despues como se que todos han
acabado?, con una variable global o algo asi¿
Salu2
Jesús López wrote:

como si son 200.
Respuesta Responder a este mensaje
#5 Jesús López
06/11/2006 - 21:29 | Informe spam
Si lanzas 20 pings, 20 veces se tendrá que ejecutar el evento
Ping_Completed, Así que si guardas en una variable el número de pings que
vas a lanzar, y cada vez que se ejecuta Ping_Completed le restas uno. Cuando
esa variable llegue a cero, se habrán terminado todos los pings.

Saludos:

Jesús López




"XiScO" escribió en el mensaje
news:
Nada, nada no me hagas caso, es que no lei bien tu post y me puese a
probar
yo sin mirar tu codigo. Cuando lanzaba un ping nuevo me decia que estaba
otro en curso, pero ya esta solucionado.
Solo una pequeña cuestion, si lanzo 20 pings, despues como se que todos
han
acabado?, con una variable global o algo asi¿
Salu2
Jesús López wrote:

como si son 200.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida