Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Sincronizar dos aplicaciones (https://www.clubdelphi.com/foros/showthread.php?t=29043)

igest2000 11-01-2006 09:07:21

Sincronizar dos aplicaciones
 
Muy buenas a todos.

Veamos necesito resolver un pequeño problema que tengo. Son dos aplicaciones, un editor por un lado y otra que genera un archivo de juego. Bien, desde el editor he querido incluir una opción de previsualización, de tal forma que para ello tengo que ejecutar la aplicación de generación del juego, cosa que tengo resuelta. Bien, ahora necesitaría poder cerrar desde el editor el generador del juego, y una vez que se cierra esta poder previsualizar el juego. Como puedo hacer esto último... porque yo de momento lo que consigo es solo la ejecución del generador desde el editor, pero una vez abierto, no se como puedo cerrar este último y una vez cerrado acceder al archivo de juego que ha generado.

Si alguien puede echarme un cable le estaré muy agradecido.

Neftali [Germán.Estévez] 11-01-2006 09:57:32

Si la aplicación que genera el juego es tuya y puedes modificarla, lo que yo haría es programar que se la pueda llamar desde la línea de comandos con 1 o dos parámetros;
De ésta forma puedes llamar a la aplicación del juego con un parámetro donde le digas el nombre del fichero de salida. Al ejecutarse, que genere el fichero y se cierre.

Si la aplicación del juego no puedes modificarla, habría que saber cómo guarda el fichero; ¿Siempre con el mismo nombre? ¿Es siempre en el mismo sitio?

Bicho 11-01-2006 10:07:18

Hola igest2000,

Si lo que quieres es cerrar otra aplicación desde la tuya prueba con algo como esto: sacado de trucomania

Nota: debes añadir al uses del programa TLHelp32

Código Delphi [-]
(*** Dado el nombre de un ejecutable lo cierra **********)
function KillTask(FileName:String):integer;
var
  ContinueLoop:BOOL;
  FSnapshotHandle:THandle;
  FProcessEntry32:TProcessEntry32;
const PROCESS_TERMINATE=$0001;
begin
  FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
  ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
  while integer(ContinueLoop)<>0 do begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName))
        or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName))) then
       Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),
                                        FProcessEntry32.th32ProcessID),0));
    ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

Saludos

delphi.com.ar 11-01-2006 13:32:12

Cita:

Empezado por Bicho
Si lo que quieres es cerrar otra aplicación desde la tuya prueba con...

Si tu primer aplicación ejecuta la segunda, y luego quieres que esta primera cierre la segunda, podrías prescindir de la ToolHelp, podrías crear el proceso utilizando CreateProcess de este modo obtienes información del proceso como para poder controlarlo. (En este caso matarlo abruptamente con ExitProcess)
Pero en tu caso yo evitaría matar abruptamente el otro proceso, sino establecería alguna comunicación mediante mensajes, y haría que el primer proceso "le pediría" al segundo que se cierre. De no hacer caso en N tiempo, si utilizaría ExitProcess.
¿Porque haces esto en dos procesos diferentes?

igest2000 19-01-2006 14:16:46

Bueno gracias a todos. Ya he conseguido con vuestras sugerencias resolver el problema y lo hice de la siguiente forma.

La aplicación principal JSGEditor ejecuta mediante createProcess la segunda. Al mismo tiempo genera un archivo en un directorio temporal donde indica que se le indica a JSGImplantador (la que crea el juego), que se trata de una ejecución para luego finalizar. De esa forma como me decíais, he modificado el código añadiendo una condición al finalizar el proceso de creación del juego y se cierra la aplicación. Por su parte en JSGEditor al ejecutar la segunda aplicación añadi un Timer para que cada segundo comprobase si aún existía el fichero temporal, que sería el que marcaría la finalización de la creación del juego mediante JSGImplantador, ya que este al cerrarse además borraría dicho archivo. De esa forma he conseguido que las dos aplicaicones queden sincronizadas.

Quizás sea un poco engorroso pero funciona.


La franja horaria es GMT +2. Ahora son las 00:44:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi