Ver Mensaje Individual
  #3  
Antiguo 04-04-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Club Delphi,

Revisen este código:
Código Delphi [-]
unit SingleInstance;

interface

implementation

uses SysUtils, Forms, Windows, Dialogs;

const
  SemaphoreName : String = 'Semaphore_SingleInstance_Delphi/Lazarus';
  NumberInstance : Integer = 3;

var
  Semaphore: THandle;
  State : Boolean;
  MsgApp : String;

procedure CheckInstance;
begin

   Semaphore := CreateSemaphore(nil,NumberInstance,NumberInstance,PChar(SemaphoreName));
   if OpenSemaphore(EVENT_MODIFY_STATE,false,PChar(SemaphoreName)) <> 0 then
   begin
      if WaitForSingleObject(Semaphore,0) <> WAIT_OBJECT_0 then
      begin
         MsgApp := Format('El Número Máximo de Instancias de la Aplicación es %d',[NumberInstance]);
         MessageDlg(MsgApp,mtInformation,[mbOk],0);
         State := False;
         Halt;
      end
      else
         State := True;
   end;

end;

procedure FreeInstance;
begin
   if Semaphore <> 0 then
   begin
      if State then ReleaseSemaphore(Semaphore,1,nil);
      CloseHandle(Semaphore);
   end
end;

initialization
  CheckInstance;

finalization
  FreeInstance;

end.
El código anterior en Delphi XE7 Sobre Windows 7 Professional x32, permite por medio de un Semaphore definir el número de instancias activas en memoria de una aplicación en función de los requerimientos de la misma, según se muestra en la siguiente imagen con un máximo de 3 instancias permitidas en este caso:



Nota
:

1- Para controlar el número de instancias de una aplicación tanto en Delphi como en Lazarus, solo debe agregarse la unidad SingleInstance al proyecto Delphi/Lazarus, la unidad ejecutara de forma automática el procedimiento CheckInstance al inicializarce y el procedimiento FreeMutex al finalizar.

2- El código propuesto funciona correctamente en Delphi 7 y Lazarus Versión #:1.2.6 FPC Version 2.6.4 bajo Windows 7 Professional x32.

3- SemaphoreName, es el nombre de la aplicación para efectos de exclusión el cual debe ser único para las funciones de Semaphore.

4- NumberInstance, es el número de instancias máximas permitidas para una aplicación en función de sus requerimientos de performance y/o recursos.

5- Este código es una ampliación del código del Msg #1, ambos son equivalentes funcionalmente si el número de instancias (NumberInstance) es 1 .

Revisen esta información:
Espero sea útil

Nelson.
Responder Con Cita