Page 1 of 1

Ejecutar otra aplicación

PostPosted: Wed Dec 03, 2008 10:30 am
by Sebastián Almirón
Hola a todos.

Tengo una aplicación (aplicación 1), que en un proceso nocturno y desatendido, tiene que ejecutar otra (aplicación 2) para hacer unos procesos de mantenimiento.

Mi problema es que ambas aplicaciones están en el servidor y en la misma carpeta y este normalmente está con el salvapantallas protegido por contraseña, y hasta que no se quita el salvapantallas la aplicación 2 no se ejecuta.

El proceso es mas o menos así:

nhandle := fcreate('CIERRE.XXX') //Se crea el fichero para emitir la orden de cierre de la aplicación 2
fclose(nhandle)
MsgWait('Cerrando Aplicacion 2 en todos los terminales','Proceso de mantenimiento',300) //Se espera 5 minutos de margen para que la Aplicación 2 se cierre, aunque se cierra en 3 minutos a partir de la creación del fichero CIERRE.XXX
winexec('APLICACION2 PRONOCTU')

Tal y como está escrito, cuando quito el salvapantallas, lleve el tiempo que lleve el mismo, me encuentro con el MsgWait en pantalla que desaparece tras cinco minutos de haber quitado el salvapantallas. Es como si el tiempo no contase cuando está el salvapantallas. Bien eso lo puedo solucionar con un Mensage NOWAIT y un bucle de espera.

Mi problema es que pasa lo mismo con el winexec(), que hasta que no quito el salvapantallas no se ejecuta. He probado con Waitrun() y con ShellExecute() y pasa lo mismo. Si no tengo puesto el salvapantallas la aplicación 2 se ejecuta correctamente y ella sola se cierra tras realizar los procesos.

¿ Hay alguna manera de lanzar una aplicación desde otra y que se ejecute aunque esté el salvapantallas ?

Espero haberme explicado, Saludos

PostPosted: Wed Dec 03, 2008 11:22 am
by karinha
YA INTETASTES CON UN ARCHIVO.BAT??

PostPosted: Wed Dec 03, 2008 12:23 pm
by Sebastián Almirón
Hola, si también lo he intentado, incluso con un RUN fichero.bat (por desesperacion), pero pasa lo mismo.

El problema parece ser que con el salvapantallas todas las ordenes de ejecución de otros programas, o los msgwait(), se quedan pendientes a que se quite el salvapantallas.

PostPosted: Wed Dec 03, 2008 12:45 pm
by karinha
MsgWait('Cerrando Aplicacion 2 en todos los terminales','Proceso de mantenimiento',300)

Porque no cambias para un dialogo?? ó usas un MSGRUN()??

PostPosted: Wed Dec 03, 2008 2:51 pm
by JmGarcia
Sebastián Almirón wrote:...El problema parece ser que con el salvapantallas todas las ordenes de ejecución de otros programas, o los msgwait(), se quedan pendientes a que se quite el salvapantallas.

Y si te haces tu propio salvapantallas...
Un SCR no es mas que un EXE renombrado.

PostPosted: Wed Dec 03, 2008 10:13 pm
by Antonio Linares
Podrias no usar salvapantallas, y hacer que tu propia aplicación simule uno.

En estos foros hemos comentado como hacerlo.

PostPosted: Wed Dec 03, 2008 10:23 pm
by Antonio Linares
Code: Select all  Expand view
// How to create a screensaver that will be executed when a GET is not used for some time

#include "FiveWin.ch"

static nTime := 0

function Main()

   local oDlg, oSay, oGet, cTest := Space( 10 )

   DEFINE DIALOG oDlg TITLE "Test"

   @ 0.5, 8 SAY oSay PROMPT "Elapsed time: " + AllTrim( Str( nTime ) ) + " secs."
   
   @ 3, 7 GET oGet VAR cTest PASSWORD
   
   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT BuildTimer( oDlg, oSay, oGet )

return nil

function BuildTimer( oDlg, oSay, oGet )

   local oTmr
   
   DEFINE TIMER oTmr OF oDlg ;
      ACTION ( nTime++, oSay:Refresh(), If( nTime > 14, ScreenSaver(),)) INTERVAL 1000

   ACTIVATE TIMER oTmr
   
   oGet:bKeyDown = { | nKey | nTime := 0, nKey }
   
return nil   

function ScreenSaver()

   static oDlg

   nTime = 0

   if oDlg == nil

      ShowWindow( FindWindow( "Shell_TrayWnd", "" ), 0 ) // Taskbar
      ShowWindow( FindWindow( "Button", "Start" ), 0 ) // Vista round button

      DEFINE DIALOG oDlg STYLE WS_VISIBLE COLOR "W/B" SIZE GetSysMetrics( 0 ), GetSysMetrics( 1 )
   
      @ 10, 10 SAY "This is a screensaver" COLOR "W/B"
   
      oDlg:bKeyDown = { || oDlg:End() }
   
      ACTIVATE DIALOG oDlg ;
         ON CLICK oDlg:End()

      ShowWindow( FindWindow( "Shell_TrayWnd", "" ), 1 )
      ShowWindow( FindWindow( "Button", "Start" ), 1 )
         
      oDlg = nil
      nTime = 0
   endif     
   
return nil     

PostPosted: Wed Dec 10, 2008 8:47 am
by Sebastián Almirón
Bueno, gracias a todos, ya lo he solucionado.

El problema en si no era la ejecución de programas sino los dialogos. A medida que iba ejecutando procesos y para saber por donde iba mostraba unos MsgRun y otros dialogos que eran los que realmente me dejaban paralizado el programa cuando el salvapantallas estaba en ejecución. La solución ha sido eliminar cualquier dialogo que pudiera aparecer durante el proceso.

Saludos y gracias de nuevo.

PostPosted: Wed Dec 10, 2008 4:52 pm
by cuatecatl82
Maestro Antonio:

He probado el ejemplo de como aplicar una screensaver en fw, y funciona a la perfección, pero me surge una duda, es posible cerrar el screensaver al mover el mouse y controlar la sensibilidad del movimiento, lo he intentado con

Code: Select all  Expand view
oDlg:bMMoved  = { |nRow, nCol, nFlags| msginfo("Se movio"), oDlg:end() }


Pero siempre aparece el mensaje sin poder hacer nada..

Creo que me falta revisar más, pero la falta de tiempo me lo impide.
:oops: :x
De todas maneras estoy haciendo algunas pruebas para implementarlo en mis aplicaciones, pero solo me falta este pequeño detalle. Creo que ando algo perdido,

Si alguien pudiera darme una idea, se lo agradeceria bastante..

Saludos.. :lol: :o