Lanzar un proceso en segundo plano

12/12/2003 - 11:20 por Alamo | Informe spam
Buenas tardes amigos del foro.

A ver si me podéis ayudar.

Tengo que lanzar un proceso de una librería, concretamente la rapi.dll para
la sincronización de una PDA y un PC.

Bueno cuando lanzo este proceso, este tarda un perido de tiempo
considerable, y el proyecto se queda bloqueado hasta la finalización del
mismo, dando un aspecto a la aplicación de poca robustez. Me gustaría poder
tener el control del formulario para que se resaltara un mensaje el cual
cambiara de color, e indicara al usuario que la aplicación aún está en
marcha.

He probado el DoEvents, pero que pasa, que este proceso que lanzo no tiene
ningún tipo de evento al cual se pueda pasar la cpu del sistema, con lo que
no tendrá efecto el uso del DoEvents.

Se me ha ocurrido intentar lanzar el proceso en segundo plano y dejar el
control de la aplicación en un bucle hasta que el proceso lanzado en segundo
plano finalice. Bien la pregunta es:

¿Como puedo en visual basic lanzar un proceso en segundo plano? ¿Es posible
hacer esto? -> ¿En Visual Basic 6.0?

Espero haberme explicado con claridad.

Gracias y un saludo,

Alamo.

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral González
12/12/2003 - 11:26 | Informe spam
La solución es crear un nuevo hilo en el que realizes la acción que bloquea
tu programa.

Un saludo
Rodrigo Corral González
#2 Rodrigo Corral González
12/12/2003 - 11:31 | Informe spam
Para evitarlo lo que tienes que hacer es crear un hilo de ejecución para
realizar la tarea que deja bloqueada la ventana.

Si no quieres complicarte con hilos y la tarea que relizas es de tipo
iterativo puede poner en cada paso de bucle llamadas a la siguiente función,
que permite que se procesen los mensajes de ventana de manera que esta no se
quede muerta, de todos modos te recomiento que uses los hilos.

void CApplication::DoEvents()
{
MSG msg;
while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
if ( !PumpMessage( ) )
{
::PostQuitMessage(0);
break;
}
}
// let MFC do its idle processing
for (long lIdle = 0; OnIdle(lIdle); lIdle++ )
{;}
}

Un saludo
Rodrigo Corral González
#3 Alamo
12/12/2003 - 16:00 | Informe spam
Gracias querido Rodrigo, pero aún sigo con el problema, voy a explicarte
porque:

Estoy haciendo un proyecto en visual basic 6.0.
Realizo una llamada a una librería, concretamente a la REMOTECE 0.1.0.3, con
el fin de enviar y recibir bases de datos access entre un PC y una PDA.
Estos procesos no generan eventos por sí solo con lo cual si utilizo el
DoEvents del Visual Basic no me es posible capturar el control de la
aplicación ya que dichos procesos no tienen eventos con lo cual el DoEvents
no me funcionaría.

Yo no tengo ni idea de Visual C++ 6.0 pero si de C, entonces había pensado
generar un ActiveX o una en Visual C++ 6.0 la cual permitiera lanzar
procesos en segundo plano, con lo cual, mi aplicación en Visual Basic 6.0
lanzara dicha función del REMOTE CE en segundo plano, y la aplicación cara
al usuario no se quedara con la imagen que se queda actualmente que es la de
estar bloqueada. He visto en libros e internet la posibilidad de lanzar
threads (hilos) con el CreateThread etc, ¿has utilizado algo parecido alguna
vez? es decir crear hilos para que estos se ejecuten de forma asincrona.

Espero haberme explicado con claridad, gracias por tu ayuda.

Te saluda,

Alamo.



"Rodrigo Corral González" escribió en el mensaje
news:
Mostrar la cita
función,
Mostrar la cita
se
Mostrar la cita
#4 KAKATUO
12/12/2003 - 20:14 | Informe spam
Si lo que quieres es mostrar algo que indique que la aplicación no se ha
quedado colgada puedes mostrar una ventana con una barra de progreso o
incluso una animación .avi como cuando se copia un archivo a una carpeta o
se descarga un archivo de internet.
También puedes utilizar un timer (con DoEvents) que haga algo a cada
intervalo, ...

Espero haberte dado alguna idea
Saluos


"Alamo" escribió en el mensaje
news:
Mostrar la cita
con
Mostrar la cita
DoEvents
Mostrar la cita
de
Mostrar la cita
alguna
Mostrar la cita
no
Mostrar la cita
#5 pablo
12/12/2003 - 20:31 | Informe spam
Alamo:

La solución ideal sería, como bien se comentó, crear un
hilo (thread) aparte para correr el proceso en segundo
plano; el tema es que si estás desarrollando en VB te
diría que trabajar con hilos seriamente es casi imposible;
sobretodo porque VB no maneja código reentrante como VC;
se podría armar algo con las API de manejo de threads pero
en la práctica no es muy seguro su funcionamiento.
Una solución podría ser la de crear un ActiveX (DLL) en VB
(puede correr en su propio hilo) con un método que llamara
a la librería, pero en forma asincrónica... hay un par de
formas para hacer esto, con timers o con llamadas
callbacks... podrías hasta poder configurar tu DLL VB con
eventos para que te avise cuando se terminó de correr el
proceso llamado

Espero te sirva...

Salu2!!

Pablo



Mostrar la cita
voy a explicarte
Mostrar la cita
REMOTECE 0.1.0.3, con
Mostrar la cita
PC y una PDA.
Mostrar la cita
si utilizo el
Mostrar la cita
control de la
Mostrar la cita
lo cual el DoEvents
Mostrar la cita
entonces había pensado
Mostrar la cita
permitiera lanzar
Mostrar la cita
Visual Basic 6.0
Mostrar la cita
la aplicación cara
Mostrar la cita
actualmente que es la de
Mostrar la cita
posibilidad de lanzar
Mostrar la cita
algo parecido alguna
Mostrar la cita
forma asincrona.
Mostrar la cita
ayuda.
Mostrar la cita
escribió en el mensaje
Mostrar la cita
de ejecución para
Mostrar la cita
relizas es de tipo
Mostrar la cita
la siguiente
Mostrar la cita
manera que esta no
Mostrar la cita
hilos.
Mostrar la cita
PM_NOREMOVE ) )
Mostrar la cita
Ads by Google
Search Busqueda sugerida