Bucle Do...Loop no permite que el programa prosiga.

22/07/2006 - 06:32 por Daniel G. Samborski | Informe spam
Una consulta, tengo un formulario con dos botones.

Iniciar y Finalizar

En iniciar tengo un do loop que genera un valor al azar y lo va mostrando en
un label en el form, esto lo hace mientras repetir sea igual a 0 y en
finalizar pone en la variable repetir a 1 para que finalice el do...loop.
La variable repetir es global.

El problema es que al poner

do
.
if repetir=1 then exit do
.
loop

el programa se cuelga o queda en el proceso del do...loop y no me permite
pulsar el boton finalizar para poner repetir=1


¿Como puedo hacer para que el bucle no impida seguir con los procesos del
programa?



Daniel.

Preguntas similare

Leer las respuestas

#1 Jesús López
22/07/2006 - 08:44 | Informe spam
Tienes dos opciones:

1) Ejecutar el bucle en otro hilo
2) Llamar periódicamente a Application.DoEvents dentro del bucle

Saludos:

Jesús López



"Daniel G. Samborski" escribió en
el mensaje news:
Una consulta, tengo un formulario con dos botones.

Iniciar y Finalizar

En iniciar tengo un do loop que genera un valor al azar y lo va mostrando
en un label en el form, esto lo hace mientras repetir sea igual a 0 y en
finalizar pone en la variable repetir a 1 para que finalice el do...loop.
La variable repetir es global.

El problema es que al poner

do
.
if repetir=1 then exit do
.
loop

el programa se cuelga o queda en el proceso del do...loop y no me permite
pulsar el boton finalizar para poner repetir=1


¿Como puedo hacer para que el bucle no impida seguir con los procesos del
programa?



Daniel.

Respuesta Responder a este mensaje
#2 Daniel G. Samborski
22/07/2006 - 14:54 | Informe spam
Gracias, el Apliction.DoEvents me sirvio muy bien...

En donde puedo conseguir un ejemplo, en castellano sobre el funcionamiento
de los hilos.


Daniel.


"Jesús López" escribió en el mensaje
news:
Tienes dos opciones:

1) Ejecutar el bucle en otro hilo
2) Llamar periódicamente a Application.DoEvents dentro del bucle

Saludos:

Jesús López



"Daniel G. Samborski" escribió en
el mensaje news:
Una consulta, tengo un formulario con dos botones.

Iniciar y Finalizar

En iniciar tengo un do loop que genera un valor al azar y lo va mostrando
en un label en el form, esto lo hace mientras repetir sea igual a 0 y en
finalizar pone en la variable repetir a 1 para que finalice el do...loop.
La variable repetir es global.

El problema es que al poner

do
.
if repetir=1 then exit do
.
loop

el programa se cuelga o queda en el proceso del do...loop y no me permite
pulsar el boton finalizar para poner repetir=1


¿Como puedo hacer para que el bucle no impida seguir con los procesos del
programa?



Daniel.





Respuesta Responder a este mensaje
#3 SoftJaén
22/07/2006 - 16:05 | Informe spam
"Daniel G. Samborski" preguntó:

En donde puedo conseguir un ejemplo, en castellano sobre
el funcionamiento de los hilos.



Hola, Daniel:

En la ayuda de Visual Basic tienes ejemplos sobre el funcionamiento de la
clase Thread. Aquí que te dejo un ejemplo que creo que se adapta a tus
necesidades. Inicia un nuevo proyecto, inserta dos botones de comando
(btnIniciar y btnFinalizar) y un control Label. Abre el editor de código y
copia/pega el siguiente código fuente:

Imports System.Threading

Public Class Form1

Private repetir As Integer

Private Sub btnIniciar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnIniciar.Click

repetir = 0

' Creamos un nuevo subproceso definiendo su punto inicial
Dim t As New Thread(New ThreadStart(AddressOf EjecutarDoLoop))

' Ejecutamos el subproceso
t.Start()

MessageBox.Show( _
"Comprueba que aparezcan números " & _
"en el control Label", "Subproceso Iniciado")

End Sub

Private Sub btnFinalizar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFinalizar.Click

repetir = 1

End Sub

Private Sub EjecutarDoLoop()

Do

' Iniciamos el generador de números aleatorios.
Randomize()

' Generamos un valor aleatorio entre 1 y 6.
Dim valor As Integer = CInt(Int((6 * Rnd()) + 1))

' Asignamos el valor del control Label
ValorEtiqueta(valor.ToString)

' Supendemos el subproceso durante medio segundo
Thread.Sleep(500)

Loop Until repetir = 1


MessageBox.Show("Subproceso finalizado.")

End Sub

' El delegado habilita las llamadas asíncronas
' para establecer el valor de la propiedad Text
' de control Label.
Private Delegate Sub SetTextCallback(ByVal texto As String)

Private Sub ValorEtiqueta(ByVal texto As String)

' Este procedimiento es el que se encargará
' de escribir el texto en el control Label

' Comprobamos si debemos ejecutar el delegado
' en el subproceso principal.
'
If Me.Label1.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf ValorEtiqueta)
Me.Invoke(d, New Object() {texto})
Else
Me.Label1.Text = texto
End If

End Sub

End Class

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#4 Daniel G. Samborski
22/07/2006 - 17:33 | Informe spam
Gracias, lo revisare.

Daniel.

"SoftJaén" escribió en el mensaje
news:%
"Daniel G. Samborski" preguntó:

En donde puedo conseguir un ejemplo, en castellano sobre
el funcionamiento de los hilos.



Hola, Daniel:

En la ayuda de Visual Basic tienes ejemplos sobre el funcionamiento de la
clase Thread. Aquí que te dejo un ejemplo que creo que se adapta a tus
necesidades. Inicia un nuevo proyecto, inserta dos botones de comando
(btnIniciar y btnFinalizar) y un control Label. Abre el editor de código y
copia/pega el siguiente código fuente:

Imports System.Threading

Public Class Form1

Private repetir As Integer

Private Sub btnIniciar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnIniciar.Click

repetir = 0

' Creamos un nuevo subproceso definiendo su punto inicial
Dim t As New Thread(New ThreadStart(AddressOf EjecutarDoLoop))

' Ejecutamos el subproceso
t.Start()

MessageBox.Show( _
"Comprueba que aparezcan números " & _
"en el control Label", "Subproceso Iniciado")

End Sub

Private Sub btnFinalizar_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFinalizar.Click

repetir = 1

End Sub

Private Sub EjecutarDoLoop()

Do

' Iniciamos el generador de números aleatorios.
Randomize()

' Generamos un valor aleatorio entre 1 y 6.
Dim valor As Integer = CInt(Int((6 * Rnd()) + 1))

' Asignamos el valor del control Label
ValorEtiqueta(valor.ToString)

' Supendemos el subproceso durante medio segundo
Thread.Sleep(500)

Loop Until repetir = 1


MessageBox.Show("Subproceso finalizado.")

End Sub

' El delegado habilita las llamadas asíncronas
' para establecer el valor de la propiedad Text
' de control Label.
Private Delegate Sub SetTextCallback(ByVal texto As String)

Private Sub ValorEtiqueta(ByVal texto As String)

' Este procedimiento es el que se encargará
' de escribir el texto en el control Label

' Comprobamos si debemos ejecutar el delegado
' en el subproceso principal.
'
If Me.Label1.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf ValorEtiqueta)
Me.Invoke(d, New Object() {texto})
Else
Me.Label1.Text = texto
End If

End Sub

End Class

Un saludo

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o
sugerido en el presente mensaje.



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