Ir para conteúdo
Fórum Script Brasil
  • 0

Verificar Existencia De Outro Programa Aberto


Guest - Fabiana -

Pergunta

Guest - Fabiana -

Olá,

Ajudem... eu tenho um programa "A" e um programa "B" em Delphi. Como eu faço para verificar no código fonte do programa "B", se o programa "A" já está em execução?

Tks.

Fabiana

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

opa

tem vários métodos, mas o mais simples de todos é

o seguinte, vamos supor que o Formulário principal

do programa A tenha o nome de FormA, então pra

detectar no FormB você faria exemplo...

function isrunning(const szClass: String): Boolean;
begin
  Result := (FindWindow(PChar('T' + szClass), nil) > 0);
end;

ai seria exemplo

if isrunning('FormA') then
//está rodando else
//não está rodando...

O segredo está no FindWindow, que é uma função da API do

Windows na qual retorna um valor maior do que 0 caso seja

encontrada uma janela que é passada em seus parâmetros..

FindWindow(Classe da Janela, Nome da Janela);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Para poder entender os exemplo, antes tem que se entender que 'Flags' funcionam como seu nome sugere. São como bandeiras sinalizadoras de um evento ou um estado do software.

Exemplos

[1] - No caso de serem dois Forms da mesma aplicação pode se usar variáveis globais. Uma forma bem sucinta de fazer é criar uma nova Unit, nessa nova Unit criar uma variável que é alterada pelos forms em tempo de execussão.

[2] - No caso de serem duas aplicações distintas pode-se usar dois métodos. 1º seria usar um campo em uma banco de dados para isso. Vantagens: esse método permite controle por rede. Desvantagens: Esse método pode se tornar lento em grandes aplicações. É bem trabalhoso. 2º Usar arquivos de texto para controle. Vantagens: Programação mais simples. Desvantagens: Um "engraçadinho" pode apagar acidentalmente esse arquivo. Pode ocorrer erros na gravação e alteração desses arquivos. Uma alternativa, complexa, mas com resultados satisfatórios é usar o registro do windows como flag.

Porém fica um alerta: A aplicação deve ser bem testada e ter os erros tratados, pois se alguém fecha um programa de forma inesperada e a modificação da flag não acontecer a contento o programa pode apresentar erros estranhos (experiência própria).

Link para o comentário
Compartilhar em outros sites

  • 0

Para poder entender os exemplo, antes tem que se entender que 'Flags' funcionam como seu nome sugere. São como bandeiras sinalizadoras de um evento ou um estado do software.

Exemplos

[1] - No caso de serem dois Forms da mesma aplicação pode se usar variáveis globais. Uma forma bem sucinta de fazer é criar uma nova Unit, nessa nova Unit criar uma variável que é alterada pelos forms em tempo de execussão.

[2] - No caso de serem duas aplicações distintas pode-se usar dois métodos. 1º seria usar um campo em uma banco de dados para isso. Vantagens: esse método permite controle por rede. Desvantagens: Esse método pode se tornar lento em grandes aplicações. É bem trabalhoso. 2º Usar arquivos de texto para controle. Vantagens: Programação mais simples. Desvantagens: Um "engraçadinho" pode apagar acidentalmente esse arquivo. Pode ocorrer erros na gravação e alteração desses arquivos. Uma alternativa, complexa, mas com resultados satisfatórios é usar o registro do windows como flag.

Porém fica um alerta: A aplicação deve ser bem testada e ter os erros tratados, pois se alguém fecha um programa de forma inesperada e a modificação da flag não acontecer a contento o programa pode apresentar erros estranhos (experiência própria).

Opa

Então, são opções, mas dentre todas elas acredito que FindWindow

ainda seja a mais viável, pois não tem erro... de todas as que você

especificou podem acontecer erros e assim ficar inseguro o método.

Outra maneira também é usando Semaforos ou Mutex, é um pouco

mais complexo mas também é seguro não tem como haver erro..

No source principal do programa(Project/View Source) coloque no começo

var
  hMutex: THandle;

hMutex := CreateMutex(nil, True, 'FormA');

  if (hMutex <> 0) then
  begin
    if (GetLastError = ERROR_ALREADY_EXISTS) then
    begin
                  //Uma aplicação já criou esse mutex, o que quer dizer que está rodando
      CloseHandle(hMutex);
      Halt;
    end
  end;

Application.Initialize;
  Application.Title := 'Fabiana ahuauha';
  Application.CreateForm(TFormA, FormA);
  Application.Run;

ReleaseMutex(hMutex);
  CloseHandle(hMutex);
end.
Ai pra checar no FormB seria só checar se já está rodando nessa parte...
if (GetLastError = ERROR_ALREADY_EXISTS) then
begin
  //Está rodando...
  CloseHandle(hMutex);
  Halt;
end;

Além do CreateMutex tem também o CreateSemaphore só que nunca usei

então não sei explicar sobre... esse método é muito usado quando pra Threads,

pra saber se determinada Thread está rodando... isso em C++ eu vi...

Mas eu ainda sou a favor do FindWindow pra ela auhahu

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

beleza.

É que lendo o post #1, tive a (errada) idéia de que estaríamos falando de aplicações onde uma pertencia ao colega e outra de origem diferente. Realmente, se as duas aplicações são desenvolvidas pela mesma pessoa, não há maior impecílio em implementar o recurso.

hencker, para o segundo exemplo, convém citar a possibilidade de as duas aplicações não utilizarem banco de dados. Daí não daria deste jeito. E também, como na questão do uso do arquivo texto, poderia ser utilizado o registro do Windows.

Churc, o uso de FindWindow ajuda muito. Mas, vale lembrar que se houverem várias instâncias do mesmo programa aberto, você acessará apenas um deles com este método.

O mutex é uma boa opção.

Neste contexto, necessitando troca de informações teriamos ainda uso de DDE e FileMapping.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...