Como trabajar con Thread en VB
Hola!
Colegas quiero trab. con los Thread en VB para lograr ejecutar una tarea(que demora) y poder continuar con otras que ocupan menos tiempo.
Agradesco cualquier ayuda
Gracias............
Colegas quiero trab. con los Thread en VB para lograr ejecutar una tarea(que demora) y poder continuar con otras que ocupan menos tiempo.
Agradesco cualquier ayuda
Gracias............
Para hacer eso que necesitas no hay una sola forma. La mas sencilla es utilizar la instrucción Doevents. Fijate en la ayuda.
Saludos,
Javier
Saludos,
Javier
utiliza la api CreateThread. Pero te aviso que no se lleva muy bien con VB.
Hacer multithreading en VB es bastante complicado. No solamente es usar CreateThread como se menciona aquí. Ese pensamiento es el que lleva a los programas de VB que lo usan al fracaso.
Para poder programar multithreading en VB necesita un muy buen conocimiento de la tecnología ActiveX (COM). Por ejemplo: No se puede llamar un método de un objeto desde un thread que no sea el que lo creó. Eso hace que el programa falle. Para hacer esto, necesita un objeto proxy, que se crea con varias llamadas a distintas funciones de la biblioteca ole32.dll.
Es en realidad difícil de explicar y no lo voy a hacer porque nunca me puedo expresar bien :(. Le recomiendo que busque tutoriales en la red, o bien compre un libro.
Para poder programar multithreading en VB necesita un muy buen conocimiento de la tecnología ActiveX (COM). Por ejemplo: No se puede llamar un método de un objeto desde un thread que no sea el que lo creó. Eso hace que el programa falle. Para hacer esto, necesita un objeto proxy, que se crea con varias llamadas a distintas funciones de la biblioteca ole32.dll.
Es en realidad difícil de explicar y no lo voy a hacer porque nunca me puedo expresar bien :(. Le recomiendo que busque tutoriales en la red, o bien compre un libro.
Mira, como dije más arriba lo más simple es utilizar DoEvents.
Eso no genera mingún thread nuevo, pero va a darte la posibilidad de hacer lo que necesitás.
La cosa es así:
Llamá al proceso que se demora, por ejemplo ProcesoLargo
Public Sub ProcesoLargo ()
' lo que sigue es solo un ejemplo
For a = 1 to 100000
Do while algo
' hacer algo
Loop
DoEvents
Next a
End Sub
Hay que ubicar la intrucción Doevents en el lugar más apropiado, eso es, que no pase demasiadas veces seguidas, pero tampoco que demore tanto, creo que unas 3 o 4 veces por segundo estaría bien. Eso también depende de tu código, podés ir probando.
¿Como funciona esto? Bien, cada vez que pasa por DoEvents, va y se fija si hay algún evento que ejecutar, entonces podés ir haciendo otras cosas.
Si ponés un timer, va a ejecutar el procedimiento del timer cada vez que pase por DoEvents (y que el timer se haya disparado).
También si el usuario presiona una opción de menú la va a ajacutar también, y cualquier otro evento.
Tenés que tener cuidado de que no se arme lío con lo que el usuario pueda hacer mientras se está ejecutando el proceso largo, es decir, que no se interfieran las variables globales por ejemplo. Por ejemplo, mientras está haciendo el proceso ejecutándose podrías deshabilitar la opción (menú, command o lo que sea) que lo llamó hasta que concluya, o si el usuario lo quiere volver a llamarlo cuando todavía no terminó, tendrás que hacer el manejo apropiado.
Bueno, espero que te quede claro el concepto y estoy casi seguro que es la manera más apropiada de hacer lo que necesitás, a no ser que el proceso largo sea algún proceso que se ejecute fuera de tu programa.
Saludos,
Javier
Eso no genera mingún thread nuevo, pero va a darte la posibilidad de hacer lo que necesitás.
La cosa es así:
Llamá al proceso que se demora, por ejemplo ProcesoLargo
Public Sub ProcesoLargo ()
' lo que sigue es solo un ejemplo
For a = 1 to 100000
Do while algo
' hacer algo
Loop
DoEvents
Next a
End Sub
Hay que ubicar la intrucción Doevents en el lugar más apropiado, eso es, que no pase demasiadas veces seguidas, pero tampoco que demore tanto, creo que unas 3 o 4 veces por segundo estaría bien. Eso también depende de tu código, podés ir probando.
¿Como funciona esto? Bien, cada vez que pasa por DoEvents, va y se fija si hay algún evento que ejecutar, entonces podés ir haciendo otras cosas.
Si ponés un timer, va a ejecutar el procedimiento del timer cada vez que pase por DoEvents (y que el timer se haya disparado).
También si el usuario presiona una opción de menú la va a ajacutar también, y cualquier otro evento.
Tenés que tener cuidado de que no se arme lío con lo que el usuario pueda hacer mientras se está ejecutando el proceso largo, es decir, que no se interfieran las variables globales por ejemplo. Por ejemplo, mientras está haciendo el proceso ejecutándose podrías deshabilitar la opción (menú, command o lo que sea) que lo llamó hasta que concluya, o si el usuario lo quiere volver a llamarlo cuando todavía no terminó, tendrás que hacer el manejo apropiado.
Bueno, espero que te quede claro el concepto y estoy casi seguro que es la manera más apropiada de hacer lo que necesitás, a no ser que el proceso largo sea algún proceso que se ejecute fuera de tu programa.
Saludos,
Javier
