Discussion:
detener un procedimiento
(demasiado antiguo para responder)
j***@gmail.com
2007-03-30 17:09:26 UTC
Permalink
haber amigos quien de ustedes me puede ayudar. Es sencillo, tengo un
procedimiento que comienza a correr cuando hago click en cierto Botton
pero quiero tener un boton que permita cancelarlo en el momento que yo
quiera, es decir, que cuando pulse el boton cancelar, se salga del
procedimiento. No se como pasar el control a la aplicacion, para que
el procedimiento se ejecute en segundo plano, y pueda en efecto hacer
click sobre el botton cancelar y cerrar el procedimiento que se
ejecuta en segundo plano alguien me puede ayudar. Gracias
SoftJaén
2007-03-31 17:34:15 UTC
Permalink
tengo un procedimiento que comienza a correr cuando hago click en
cierto Botton pero quiero tener un boton que permita cancelarlo
en el momento que yo quiera
Hola:

Si utilizas Visual Basic 2005, puedes ejecutar operaciones en segundo plano
utilizando el control «BackgroundWorker».

Imagina que tienes el siguiente procedimiento, que es el que deseas cancelar
en cualquier momento:

Private Sub EjecutarBucle()

Dim n As Int32

For n = 0 To 1000000
' Si se ha solicitado la cancelación de la operación
' salimos del bucle.
If BackgroundWorker1.CancellationPending = True Then Exit For

Debug.WriteLine("Línea número " & n.ToString)
Next

End Sub

En el botón de inicio del proceso, escribirías lo siguiente:

Private Sub Button1_Click( ...) Handles Button1.Click

If Not Me.BackgroundWorker1.IsBusy Then
' Si no se está efectuando una operación
' asíncrona, ejecuto la acción solicitada.
'
With BackgroundWorker1
.WorkerSupportsCancellation = True
.RunWorkerAsync()
End With
End If

End Sub

Y en el evento «DoWork» del control «BackgroundWorker» llamarías al
procedimiento que deseas ejecutar:

Private Sub BackgroundWorker1_DoWork(...) Handles BackgroundWorker1.DoWork
EjecutarBucle()
End Sub

Por último, cancelarías la operación en el segundo botón de la siguiente
manera:

Private Sub Button2_Click(...) Handles Button2.Click
Me.BackgroundWorker1.CancelAsync()
End Sub

¡Eso es todo!

Para más información, consulta dicho control en la ayuda de Visual Studio,
donde también encontrarás el tutorial «Implementar un formulario que utiliza
una operación en segundo plano».

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.
j***@gmail.com
2007-04-03 18:35:18 UTC
Permalink
muchas Gracias eso esta bien para 2005, y considero que uno siempre
debe usar las nuevas tecnologias, sin embargo me gusta conocer
realmente el funcionamiento de las mismas, en este caso le
recomendaria si tiene algun ejemplo ayuda tutorial cualquier cosa de
como mandarlo un subproceso en versiones anterirores, es decir cual es
la logica de esto. eso funciona igual que los hilos o no?. cualquier
ayuda sirve. GRacias
SoftJaén
2007-04-04 13:19:09 UTC
Permalink
Post by j***@gmail.com
eso esta bien para 2005, y considero que uno siempre
debe usar las nuevas tecnologias, sin embargo me gusta conocer
realmente el funcionamiento de las mismas, en este caso le
recomendaria si tiene algun ejemplo ayuda tutorial cualquier cosa de
como mandarlo un subproceso en versiones anterirores, es decir cual es
la logica de esto. eso funciona igual que los hilos o no?
¿Me recomiendas si tengo un ejemplo? ¡Jeje!

Yo, sí te recomiendo que en tus nuevos mensajes indicaras la versión de
Visual Studio que utilizas, porque de esa forma nos iríamos directamente al
bulto, y de camino me hubieras ahorrado el prepararte el ejemplo del control
«BackgroundWorker». ¡Vamos! Que de saberlo, el sábado pasado ya hubieras
tenido la respuesta. ;-)

Para manejar subprocesos con las versiones anteriores de Visual Basic .net,
deberás de usar la clase «Thread» incluida en el espacio de nombres
«System.Threading».

Utilizando el mismo procedimiento de mi ejemplo anterior, a nivel del
formulario declararías una variable objeto del tipo «Thread»:

Imports System.Threading

' Definimos un nuevo subproceso.
'
Private th As New Thread(AddressOf EjecutarBucle)

Cuando quieras comenzar el bucle, iniciarías el subproceso:

' Iniciamos el subproceso
th.Start()

Y cuando desees cancelarlo, ejecutarías lo siguiente:

' Suspendemos el proceso
th.Suspend()

Para más información, o para otras cuestiones teóricas sobre la clase
«Thread», consulta dicha clase en la ayuda de Visual Studio.
--
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.
SoftJaén
2007-04-04 13:41:22 UTC
Permalink
¡Bueno! Si en lugar de suspender el subproceso, deseas terminarlo, entonces
deberás llamar al método «Abort».

Mejor será que ejecutes el código de la siguiente manera. A nivel de la
clase, solamente deberás declarar la variable objeto, pero SIN iniciarla:

Imports System.Threading

Private th As Thread

En el botón de inicio:

If th Is Nothing Then
' Definimos un nuevo subproceso.
'
th = New Thread(AddressOf EjecutarBucle)
'
' Iniciamos el proceso
th.Start()
End If

En el botón de finalización:

If Not th Is Nothing Then
' Terminamos el proceso
th.Abort()
th = Nothing
End If

De esta forma tendrás menos problemas. :-)
--
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.
Loading...