Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2003
acrophet acrophet is offline
Miembro
 
Registrado: sep 2003
Posts: 175
Poder: 21
acrophet Va por buen camino
controlar si mi programa se ejecuta

Hola amigos, navegando por ahi encontre algo sobre como controlar si mi programa esta corriendo o no; pasteo:

--------------------------------------------------------------------
Para detectar si tu aplicación ya está corriendo puedes usar "átomos". Windows cuenta con una tabla global donde se pueden dejar cadenas de caracteres (Strings) a los que denomina átomos. En tu aplicación podrías consultar esta tabla buscando un string determinado. Si lo encuentras, entonces tu aplicación estará corriendo, y si no lo encuentras lo agregas. Al finalizar la aplicación debes eliminar este string de la tabla.
Debes tener cuidado de que tu aplicación termine normalmente, ya que en caso contrario tu string quedará en la tabla y al ejecutar tu aplicación, esta no correrá nuevamente hasta que reinicies Windows.
El código es el siguiente, no olvides poner en la cláusula uses, Windows para las funciones de los átomos, y Dialogs para ShowMessage :


program TestInstancias;

uses Windows, Dialogs, Forms,
utMainInstancias in 'utMainInstancias.pas' {Form1};

{$R *.RES}
Const
StrAtomo = 'Mi Aplicación';

Var
IdAtomo: Word;

begin

If GlobalFindAtom( StrAtomo ) = 0 //No lo encuentra?
Then
Begin //Agrega String y Obtiene id del atomo
IdAtomo := GlobalAddAtom( PChar(StrAtomo) );
Application.Initialize; //Ejecuta aplicacion normalmente
Application.CreateForm(TForm1, Form1);
Application.Run;
GlobalDeleteAtom(IdAtomo); //Elimina el Atomo
End
Else ShowMessage('¡La Aplicación ya está corriendo!');

end.
-----------------------------------------------------------------

Bien, esto funciona perfectamente pero mi problema viene cuando el programa no termina normalmente, porque pete, porque estoy depurandolo y lo resetee o lo que sea. La cosa es que se queda pillado y siempre "entiende" que ya se está ejecutando.
Alguien me podria dar una pista sobre como cepillarmelo de memoria, porque ni matando el proceso funciona.
Gracias.
Responder Con Cita
  #2  
Antiguo 18-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
mirate este hilo de no hace mucho http://www.clubdelphi.com/foros/show...&threadid=3662

Yo personalmente utilizo más o menos lo que propone el amigo Román, pero las otras soluciones también son válidas
Responder Con Cita
  #3  
Antiguo 18-09-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Como solución primaria, utilizaría las herramientas del lenguaje:
Código:
  If GlobalFindAtom( StrAtomo ) = 0 Then
  begin
    IdAtomo := GlobalAddAtom( PChar(StrAtomo) );
    try
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    finally
      GlobalDeleteAtom(IdAtomo); //Elimina el Atomo
    end
  end
  else
    ShowMessage('¡La Aplicación ya está corriendo!');
Pero si el usuario "Mata" el proceso, nunca se ejecutará el GlobalDeleteAtom, por lo que quedará en la lista global. Por eso prefiero usar "Semáforos" (CreateSemaphore) que son visibles desde todos los procesos y se eliminan cuando el proceso se elimina:
Código:
const
  PApplicationId = 'Nombre del la Aplicación';

var
  hSemaphore: THandle;
begin
  hSemaphore := CreateSemaphore(nil, 0, 1, PApplicationId);
  if (hSemaphore <> 0) and (GetLastError=ERROR_ALREADY_EXISTS) Then
    ShowMessage('¡La Aplicación ya está corriendo!')
  else
    try
      ShowMessage('Application.Run');
    finally
      CloseHandle(hSemaphore);
    end;
end.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 18-09-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Como una opinión, muchos de los trucos acerca de esto se limitan a detectar si una aplicación está ejecutándose o no. Pero desde el punto de vista del usuario es amable que la aplicación active la instancia anterior en lugar de simplemente presentar un mensaje: cuando el usuario trata de abrir la aplicación es, generalmente, porque la quiere usar, de manera que lo que desea es ver la ventana de la aplicación y no un mensaje de regaño. En mi caso particular esto último es lo qe mas trabajo me costó ya que un simple Application.BringToFront no siempre es suficiente o quedaba el botón de la aplicación parpadeando. Hasta donde he podido probarlo, el método que uso en mi página logra activar la aplicación sin ningún problema.

// Saludos

pd: lo que dice el amigo delphi.com.ar acerca de los semáforos no lo sabía. Voy a probarlo y quizá cambie el código para usar semáforos en lugra de mutex.

Última edición por roman fecha: 18-09-2003 a las 16:48:41.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:50: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
Copyright 1996-2007 Club Delphi