Cómo continuar con el proceso cuando un exe esté cerrado

162 views
Skip to first unread message

Altavoz2000

unread,
Jul 18, 2025, 11:29:05 PM7/18/25
to Comunidad de Visual Foxpro en Español
Compañeros;

No logro estructurar una rutina, me podrían dar pistas??

Tengo un punto de venta muy básico, utilizo base de datos nativa del zorro (aún no he dado el paso a otro tipo de manejador de bases de datos debido a que tengo miles de dadas al respecto, pero ese es otro asunto. Por lo que implementé otro programa aparte para crear un respaldo de la base de datos y sus tablas y la idea es lanzarlo al cerrar el punto de venta porque  a pesar de usar Close Databases ALL, me sigue marcando un error al compactar con XStandard.Zip.

La idea es cuando cierro el EXE de tienda, ejecute el EXE de respaldos, pero tengo que validar que el exe de Tienda ya esté cerrado.

Desde el programa principal que lanza al formulario de Respaldos programé un Timer y ejecuto las siguientes líneas:

tOpen = FOPEN( "tienda", 2 ) 
IF tOpen > 0 
           =FCLOSE( "tienda" ) 
           Do form sys(5) + '\forms\respaldo'
ELSE 
          WAIT "" TimeOut 500
Endif

Sin embargo tengo dudas si está bien estructurado.

Saludos a todos.

Victor Espina

unread,
Jul 19, 2025, 9:55:30 AM7/19/25
to Comunidad de Visual Foxpro en Español
Una forma sencilla seria asi:   al final de tu POS pones esto:

STRTOFILE("POS IS RUNNING","POS.MRK")
LOCAL oWSH
oWSH = CREATE("WScript.Shell")
oWSH.Run(FULLPATH("backup.exe"),0,0). && EL ULTIMO 0 HACE QUE EL PROGRAMA BACKUP.EXE SE LANCE Y EL CONTROL VUELVE INMEDIATAMENTE
ERASE POS.MRK
IF _VFP.startMode <> 0
    QUIT
ENDIF
RETURN

luego en el inicio de tuy programa de backup pones:


DO WHILE FILE("POS.MRK")
    WAIT "Iniciando, por favor espere..." WINDOW NOWAIT
    DOEVENTS
ENDDO
WAIT CLEAR


Eso causara que el programa de backup se quede esperando hasta que el POS elimine el archifvo POS.MRK justo antes de finalizar, por lo que cuando el programa salga del DO WHILE ya estas seguro que el POS no esta ejecutando.  Otra forma, quizas mas confiable, seria usar WMI para consultar la lista de procesos y ver si el EXE del POS essta ejecutando.   No tengo la rutina a mano, pero le pedi a ChatGPT que me generara una funcion basada en WMI:

FUNCTION IsProcessRunning(tcExeName)
    *---------------------------------------------------
    * Verifica si un proceso con nombre tcExeName está activo
    * tcExeName debe incluir la extensión, por ejemplo: "notepad.exe"
    *---------------------------------------------------
    LOCAL loWMI, loProcessList, loProcess, lcName
    LOCAL llFound
    llFound = .F.

    TRY
        loWMI = GetObject("winmgmts:\\.\root\cimv2")
        loProcessList = loWMI.ExecQuery("SELECT Name FROM Win32_Process")

        FOR EACH loProcess IN loProcessList
            lcName = LOWER(loProcess.Name)
            IF lcName == LOWER(tcExeName)
                llFound = .T.
                EXIT
            ENDIF
        ENDFOR

    CATCH TO loError
        ? "Error al consultar los procesos: " + loError.Message
        RETURN .F.
    ENDTRY

    RETURN llFound
ENDFUNC


Con esto pondrias este codigo al inicio de tu BACKUP.EXE:

LOCAL nStart,nTimeout
nTimeout = 15.   && ESPERAMOS UN MAXIMO DE 15 SEG
nStart = SECONDS()
DO WHILE isProcessRunning("POS.EXE") AND SECONDS() - nStart < nTimeout
    WAIT "Iniciando, por favor espere..."
    DOEVENTS
ENDDO
WAIT CLEAR
IF SECONDS() - nStart >= nTimeout
     MESSAGEBOX("Timeout!")
     RETURN
ENDIF


El tema con WMI es que a veces las politicas de seguridad del equipo pueden bloquear que el usuario acceda a esos recursos, como la lista de procesos, y tu codigo fallaria.  Ahi es donde el primer ejemplo es mas "seguro" en el sentido de que si o si va a ejecutar.

Saludos

Victor Espina
    

Zarlu

unread,
Jul 19, 2025, 9:57:31 AM7/19/25
to Comunidad de Visual Foxpro en Español
Buenos días altavoz!

Analiza esto:
CLEAR
lc=GETFILE()&&obtengo un exe
tOpen = FOPEN( lc, 2 )&&intento abrirlo
IF tOpen > 0 &&se pudo abrir
? "rutina de respaldo de datos"
tClose=FCLOSE(tOpen)&&cierro exe
ELSE
? "No se pudo abrir, ocupado"
Endif

Suerte
zarlu
Chetumal, Quintana Roo, México
Reply all
Reply to author
Forward
0 new messages