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.