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
Respuesta Responder a este mensaje
#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
Respuesta Responder a este mensaje
#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:
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


Respuesta Responder a este mensaje
#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:
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:
> 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
>
>


Respuesta Responder a este mensaje
#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



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:
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






.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida