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