Pesquise no Blog

 

terça-feira, 26 de fevereiro de 2008

Evitar múltiplas instâncias do Programa

O tratamento de múltiplas instâncias do executável é uma praticamuito útil, principalmente quando não queremos que os usuários trabalhem com mais de uma instância de nossas aplicações.

Ja vi muitas gambiarras bizzarras e pouco elegantes para resolver esse problema, neste tutorial vou mostrar uma maneira simples e elegante pare resolver de uma vez por todas esse prblema:

Declare a variável global
var
{...} HMutex: THandle; //Essa variável deve ser GLOBAL


No onCreate do seu form digite o seguinte código
Var
{...} FileName : PChar;
begin
{...}FileName := PChar( ExtractFilePath( Application.Exename ) );
{...} HMutex := createMutex(nil, True, FileName);

{...}if ( HMutex = 0 ) or ( GetLastError = ERROR_ALREADY_EXISTS ) then
{...}{...}raise Exception.Create('O programa já está em execução.');

(* Restante da sua lógica.... *)
end;


No on close

ReleaseMutex( HMutex );

Pronto.

Para saber mais: Exclusão Mútua ( Mutex )
: Win32 Error codes

2 comentários:

Anônimo disse...

Olá Hat,
O que exatamente faz esse CreateMutex?
Eu já vi um código mais ou menos no estilo dessem só que para Linux. Ele criava um "arquivo especial" no diretório /tmp e quando fechava ele excluia esse arquivo... O problema é que quando acaba a luz por exemplo, o arquivo não era excluido, e quando reiniciava o pc, o programa não executava mais...
Com esse código que você passou, não corre o risco disso acontecer tb?

Anônimo disse...

Junior, o Mutex é uma variável do tipo MONITOR e não um arquivo.

Não sei exatamente se ele cria algum arquivo, mas eu tenho quase certeza que ele apenas marca a região da memória do formulário em questão e impede que ele seja acessado por mais de um processo.