thread y form bloqueado

22/01/2005 - 18:11 por axxegfx | Informe spam
Me gustaria saber como puedo hacer los siguiente con un aplicación que lanza
un thread:

1- que no se bloquee el Form o interfaz gráfica

2- poner en un Textbox la variable de un bucle FOR-NEXT

Creo que la única forma es con delegate o se puede hacer con la clase
thread???

Preguntas similare

Leer las respuestas

#1 Angel J. Hernández M.
23/01/2005 - 01:21 | Informe spam
Saludos... Puedes hacer lo siguiente

' Defines un miembro que albergará el número máximo de vueltas (Valor del
TextBox)
Private vueltas As Integer = 0

' Código del evento click (Permite disparar el hilo)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim hiloinicial As New Threading.Thread(New
Threading.ThreadStart(AddressOf Me.EjecutaHilo))
hiloinicial.Start()
End Sub

' Código ejecutado por el hilo
Private Sub EjecutaHilo()
vueltas = Integer.Parse(TextBox1.Text)
For x As Integer = 0 To vueltas
' Solo iterar acá...
Next
End Sub

La explicación del por qué la interfaz de usuario no se bloquea es que un
hilo se encarga de realizar una tarea sin intervenir con el hilo principal
de la aplicación el cual tiene entre sus tareas mantener el área cliente de
la ventana (por ejemplo, refrescar). Espero te sirva.

Saludos,


Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda
http://ajhsis.net

"axxegfx" escribió en el mensaje
news:
Me gustaria saber como puedo hacer los siguiente con un aplicación que
lanza
un thread:

1- que no se bloquee el Form o interfaz gráfica

2- poner en un Textbox la variable de un bucle FOR-NEXT

Creo que la única forma es con delegate o se puede hacer con la clase
thread???
Respuesta Responder a este mensaje
#2 axxegfx
23/01/2005 - 11:39 | Informe spam
Ok, entendido y ya que soy novato en este lenguaje y veo que tu me llevas
ventaja , ¿ sabes como podría en ese bucle que me pusiera en el textbox
la variable x del bucle?

obtengo una error de referencia cruzada ilegal del thread

"Angel J. Hernández M." wrote:

Saludos... Puedes hacer lo siguiente

' Defines un miembro que albergará el número máximo de vueltas (Valor del
TextBox)
Private vueltas As Integer = 0

' Código del evento click (Permite disparar el hilo)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim hiloinicial As New Threading.Thread(New
Threading.ThreadStart(AddressOf Me.EjecutaHilo))
hiloinicial.Start()
End Sub

' Código ejecutado por el hilo
Private Sub EjecutaHilo()
vueltas = Integer.Parse(TextBox1.Text)
For x As Integer = 0 To vueltas
' Solo iterar acá...
Next
End Sub

La explicación del por qué la interfaz de usuario no se bloquea es que un
hilo se encarga de realizar una tarea sin intervenir con el hilo principal
de la aplicación el cual tiene entre sus tareas mantener el área cliente de
la ventana (por ejemplo, refrescar). Espero te sirva.

Saludos,


Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda
http://ajhsis.net

"axxegfx" escribió en el mensaje
news:
> Me gustaria saber como puedo hacer los siguiente con un aplicación que
> lanza
> un thread:
>
> 1- que no se bloquee el Form o interfaz gráfica
>
> 2- poner en un Textbox la variable de un bucle FOR-NEXT
>
> Creo que la única forma es con delegate o se puede hacer con la clase
> thread???



Respuesta Responder a este mensaje
#3 axxegfx
23/01/2005 - 11:53 | Informe spam
Angel,

He probado el código en el que estoy realizando y te relato el resultado

la aplicacion principal genera 10 hilos , estos son lanzados en background,
primero lanzo el que tu me has anexado y así hasta el 10 de los que yo tenía.
cambio de ventana , pongo la ventana del internet explorer delante vuelvo al
icono
de la aplicación que tenía detrás , ventana bloqueada.

No se si me he explicado, pero te anexo parte del código:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Me.DoWorkAndWaitForCompletion()
end sub
Public Sub DoWorkAndWaitForCompletion()

Dim s1 As New Thread(AddressOf DoSubWork1)
Dim s2 As New Thread(AddressOf DoSubWork2)
Dim s3 As New Thread(AddressOf DoSubWork3)
Dim s4 As New Thread(AddressOf DoSubWork4)
Dim s5 As New Thread(AddressOf DoSubWork5)
Dim s6 As New Thread(AddressOf DoSubWork6)
Dim s7 As New Thread(AddressOf DoSubWork7)
Dim s8 As New Thread(AddressOf DoSubWork8)
Dim s9 As New Thread(AddressOf DoSubWork9)
Dim s10 As New Thread(AddressOf DoSubWork10)
Dim hiloinicial As New Threading.Thread(New
Threading.ThreadStart(AddressOf Me.EjecutaHilo))
hiloinicial.Start()

s1.IsBackground = True
s1.Priority = ThreadPriority.Highest
s1.Start()
s1.Join()
s1 = Nothing

s2.IsBackground = True
s2.Priority = ThreadPriority.Highest
s2.Start()
s2.Join()
s2 = Nothing

s3.IsBackground = True
s3.Priority = ThreadPriority.Highest
s3.Start()
s3.Join()
s3 = Nothing

s4.IsBackground = True
s4.Priority = ThreadPriority.Highest
s4.Start()
s4.Join()
s4 = Nothing

s5.IsBackground = True
s5.Priority = ThreadPriority.Highest
s5.Start()
s5.Join()
s5 = Nothing

s6.IsBackground = True
s6.Priority = ThreadPriority.Highest
s6.Start()
s6.Join()
s6 = Nothing

s7.IsBackground = True
s7.Priority = ThreadPriority.Highest
s7.Start()
s7.Join()
s7 = Nothing

s8.IsBackground = True
s8.Priority = ThreadPriority.Highest
s8.Start()
s8.Join()
s8 = Nothing

s9.IsBackground = True
s9.Priority = ThreadPriority.Highest
s9.Start()
s9.Join()
s9 = Nothing

s10.IsBackground = True
s10.Priority = ThreadPriority.Highest
s10.Start()
s10.Join()
s10 = Nothing

Te anexo lo que hace 1 hilo de los 10

Public Sub DoSubWork1()
Dim count_lanzo_ping1 As Integer
Dim host, result As String
Dim ns As New LookupNS
For count_lanzo_ping1 = 1 To count
result = ""
host = dominio(count_lanzo_ping1) & ".com"
Try
result = ns.Query(host).NameServer
Catch
pinga(count_lanzo_ping1) = "0"
End Try
If (ns.LastErrorCode <> 0) Then result = ns.LastError
If Mid(result, 1, 8) <> "DNSError" Then
pinga(count_lanzo_ping1) = "X"
Else
pinga(count_lanzo_ping1) = "0"
End If
Next
End Sub

Este hilo realiza un whois de un archivo batch sucesivamente para ver si
esta registrado, quiero decir con este ejemplo:






El bucle del hilo probaria






El resto de hilos probarian






"Angel J. Hernández M." wrote:

Saludos... Puedes hacer lo siguiente

' Defines un miembro que albergará el número máximo de vueltas (Valor del
TextBox)
Private vueltas As Integer = 0

' Código del evento click (Permite disparar el hilo)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim hiloinicial As New Threading.Thread(New
Threading.ThreadStart(AddressOf Me.EjecutaHilo))
hiloinicial.Start()
End Sub

' Código ejecutado por el hilo
Private Sub EjecutaHilo()
vueltas = Integer.Parse(TextBox1.Text)
For x As Integer = 0 To vueltas
' Solo iterar acá...
Next
End Sub

La explicación del por qué la interfaz de usuario no se bloquea es que un
hilo se encarga de realizar una tarea sin intervenir con el hilo principal
de la aplicación el cual tiene entre sus tareas mantener el área cliente de
la ventana (por ejemplo, refrescar). Espero te sirva.

Saludos,


Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda
http://ajhsis.net

"axxegfx" escribió en el mensaje
news:
> Me gustaria saber como puedo hacer los siguiente con un aplicación que
> lanza
> un thread:
>
> 1- que no se bloquee el Form o interfaz gráfica
>
> 2- poner en un Textbox la variable de un bucle FOR-NEXT
>
> Creo que la única forma es con delegate o se puede hacer con la clase
> thread???



Respuesta Responder a este mensaje
#4 Angel J. Hernández M.
23/01/2005 - 14:17 | Informe spam
Cambia el valor de la propiedad priority (ponlo en Lowest). El método Join,
espera a que finalice uno para el otro comenzar si quieres hacerlo
concurrente no creo que te haga falta. En el click del botón disparas un
hilo el cual el código va a disparar los otros, me sigues? No es necesario
que los hilos los iguales a nothing. Haz algo similar a esto:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim hiloinicial As New Threading.Thread(New
Threading.ThreadStart(AddressOf Me.EjecutaHilo))
hiloinicial.Start()
end sub

Private Sub EjecutaHilo()
Dim s1 As New Thread(AddressOf DoSubWork1)
Dim s2 As New Thread(AddressOf DoSubWork2)
Dim s3 As New Thread(AddressOf DoSubWork3)
Dim s4 As New Thread(AddressOf DoSubWork4)
Dim s5 As New Thread(AddressOf DoSubWork5)
Dim s6 As New Thread(AddressOf DoSubWork6)
Dim s7 As New Thread(AddressOf DoSubWork7)
Dim s8 As New Thread(AddressOf DoSubWork8)
Dim s9 As New Thread(AddressOf DoSubWork9)
Dim s10 As New Thread(AddressOf DoSubWork10)

' Cambiale la prioridad acá

' Disparalos acá
End Sub


Saludos,


Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda
http://ajhsis.net





"axxegfx" escribió en el mensaje
news:
Angel,

He probado el código en el que estoy realizando y te relato el resultado

la aplicacion principal genera 10 hilos , estos son lanzados en
background,
primero lanzo el que tu me has anexado y así hasta el 10 de los que yo
tenía.
cambio de ventana , pongo la ventana del internet explorer delante vuelvo
al
icono
de la aplicación que tenía detrás , ventana bloqueada.

No se si me he explicado, pero te anexo parte del código:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Me.DoWorkAndWaitForCompletion()
end sub
Public Sub DoWorkAndWaitForCompletion()

Dim s1 As New Thread(AddressOf DoSubWork1)
Dim s2 As New Thread(AddressOf DoSubWork2)
Dim s3 As New Thread(AddressOf DoSubWork3)
Dim s4 As New Thread(AddressOf DoSubWork4)
Dim s5 As New Thread(AddressOf DoSubWork5)
Dim s6 As New Thread(AddressOf DoSubWork6)
Dim s7 As New Thread(AddressOf DoSubWork7)
Dim s8 As New Thread(AddressOf DoSubWork8)
Dim s9 As New Thread(AddressOf DoSubWork9)
Dim s10 As New Thread(AddressOf DoSubWork10)
Dim hiloinicial As New Threading.Thread(New
Threading.ThreadStart(AddressOf Me.EjecutaHilo))
hiloinicial.Start()

s1.IsBackground = True
s1.Priority = ThreadPriority.Highest
s1.Start()
s1.Join()
s1 = Nothing

s2.IsBackground = True
s2.Priority = ThreadPriority.Highest
s2.Start()
s2.Join()
s2 = Nothing

s3.IsBackground = True
s3.Priority = ThreadPriority.Highest
s3.Start()
s3.Join()
s3 = Nothing

s4.IsBackground = True
s4.Priority = ThreadPriority.Highest
s4.Start()
s4.Join()
s4 = Nothing

s5.IsBackground = True
s5.Priority = ThreadPriority.Highest
s5.Start()
s5.Join()
s5 = Nothing

s6.IsBackground = True
s6.Priority = ThreadPriority.Highest
s6.Start()
s6.Join()
s6 = Nothing

s7.IsBackground = True
s7.Priority = ThreadPriority.Highest
s7.Start()
s7.Join()
s7 = Nothing

s8.IsBackground = True
s8.Priority = ThreadPriority.Highest
s8.Start()
s8.Join()
s8 = Nothing

s9.IsBackground = True
s9.Priority = ThreadPriority.Highest
s9.Start()
s9.Join()
s9 = Nothing

s10.IsBackground = True
s10.Priority = ThreadPriority.Highest
s10.Start()
s10.Join()
s10 = Nothing

Te anexo lo que hace 1 hilo de los 10

Public Sub DoSubWork1()
Dim count_lanzo_ping1 As Integer
Dim host, result As String
Dim ns As New LookupNS
For count_lanzo_ping1 = 1 To count
result = ""
host = dominio(count_lanzo_ping1) & ".com"
Try
result = ns.Query(host).NameServer
Catch
pinga(count_lanzo_ping1) = "0"
End Try
If (ns.LastErrorCode <> 0) Then result = ns.LastError
If Mid(result, 1, 8) <> "DNSError" Then
pinga(count_lanzo_ping1) = "X"
Else
pinga(count_lanzo_ping1) = "0"
End If
Next
End Sub

Este hilo realiza un whois de un archivo batch sucesivamente para ver si
esta registrado, quiero decir con este ejemplo:






El bucle del hilo probaria






El resto de hilos probarian






"Angel J. Hernández M." wrote:

Saludos... Puedes hacer lo siguiente

' Defines un miembro que albergará el número máximo de vueltas (Valor del
TextBox)
Private vueltas As Integer = 0

' Código del evento click (Permite disparar el hilo)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim hiloinicial As New Threading.Thread(New
Threading.ThreadStart(AddressOf Me.EjecutaHilo))
hiloinicial.Start()
End Sub

' Código ejecutado por el hilo
Private Sub EjecutaHilo()
vueltas = Integer.Parse(TextBox1.Text)
For x As Integer = 0 To vueltas
' Solo iterar acá...
Next
End Sub

La explicación del por qué la interfaz de usuario no se bloquea es que un
hilo se encarga de realizar una tarea sin intervenir con el hilo
principal
de la aplicación el cual tiene entre sus tareas mantener el área cliente
de
la ventana (por ejemplo, refrescar). Espero te sirva.

Saludos,


Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda
http://ajhsis.net

"axxegfx" escribió en el mensaje
news:
> Me gustaria saber como puedo hacer los siguiente con un aplicación que
> lanza
> un thread:
>
> 1- que no se bloquee el Form o interfaz gráfica
>
> 2- poner en un Textbox la variable de un bucle FOR-NEXT
>
> Creo que la única forma es con delegate o se puede hacer con la clase
> thread???



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida