Buscar

Controlando múltiplas instâncias com mutex

Código

{Para se tornar um programador, é necessário ter conhecimento do ambiente em que trabalhamos. Uma área de trabalho gráfica repleta de ícones, cores e inúmeras janelas. Aos poucos, tudo acaba tornando se óbvio demais, entretanto, para o usuário final que irá utilizar as aplicações desenvolvidas por você, pode ser o mais temido pesadelo. Na época do MS-DOS somente era possível executar um aplicativo de cada vez, mas quando o Windows chegou, confundiu a cabeça de muitos usuários. Hoje é possível editar um arquivo texto, finalizar os cálculos de uma planilha eletrônica, e imprimir etiquetas de um banco de dados tudo ao mesmo tempo. As vezes são muitas janelas abertas que acabam atrapalhando. É muito comum o usuário abrir diversas instâncias de um mesmo aplicativo sem perceber, e somente notar ao tentar desligar o computador.
Seria ideal se pudéssemos limitar o número de vezes que um aplicativo pode estar ativo na memória. Em alguns casos, dependendo do programa desenvolvido, é realmente necessário limitar a uma instância, somente. Veremos neste artigo como detectar se outro aplicativo já está rodando e como restaurar a outra instância do programa, caso esteja minimizada.

O Erro comum
Na mesma velocidade em que a linguagem Delphi se propagou, inúmeros sites da Internet foram criados, contendo informações técnicas sobre Delphi. Hoje é possível consultar centenas de sites, alguns deles com dicas desatualizadas desde 1996. Portanto tome cuidado com as informações lá obtidas. A primeira versão do Delphi foi originalmente criada para rodar no Windows 3.11, um ambiente 16 bits, com inúmeras diferenças do ambiente do Windows 9x / NT / 2000.

Muitas dicas encontradas apresentam uma solução aparentemente simples: verificar o conteúdo de hPrevInst. Se o valor for diferente de zero, então o aplicativo já está rodando, e pode-se abortar a execução do programa. Só que no ambiente Win32, o valor de hPrevInst será sempre zero.

Criando um Mutex
Mutex é um objeto de sincronização que contém um indicador para sinalizar quando ele pertence a um processo, e não sinalizado quando não existir nenhum processo. Somente um processo por vez pode requisitar um objeto mutex. Isto é útil para podermos coordenar exclusivos acessos a um recurso compartilhado. Por exemplo, para prevenir que dois processos gravem em uma mesma área de memória compartilhada, ao mesmo tempo. Podemos então utilizar esta mesma técnica, só que para verificar se algum aplicativo já é dono de um determinado mutex.

Neste exemplo utilizaremos a função CreateMutex para criar o objeto de sincronização.

O exemplo seguinte utiliza a função CreateMutex para criar um mutex, e caso não seja possível a criação, cancela a execução do programa. Esta função requer três parâmetros: o primeiro lpMutexAttributes iremos passar NULL; o segundo bInitialOwner indica se o processo que está criando deve ser o dono incial do objeto; o terceiro lpName é o nome único, para todo o sistema, que deveremos associar ao objeto. Caso ocorra um erro na criação do mutex, é porque este programa já esta sendo executado, então a função Halt() é chamada para finalizar a execução deste processo.}


procedure TForm1.FormCreate(Sender: TObject);
begin
  //cria um mutex usando um nome único
  CreateMutex(nil, False, 'SoftCast.OnlyOne');

  //verifica se houve erro na criação
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    MessageBox(0, 'Este programa já está sendo executado’,
                                      '
Aviso', MB_ICONSTOP);
    Halt(0); // cancela execução
  end;
end;

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Componentes
Adicionada dia: 30/01/04
Por: EX-DELPHIANO
Visualizada: 15416 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009