Como trabajar con Thread en VB

Jorge
31 de Octubre del 2002
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............

javierbalk
31 de Octubre del 2002
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

Jorge
31 de Octubre del 2002
utiliza la api CreateThread. Pero te aviso que no se lleva muy bien con VB.

webJose
31 de Octubre del 2002
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.

javierbalk
31 de Octubre del 2002
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