Guest - Fabiana - Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 opatem vários métodos, mas o mais simples de todos éo seguinte, vamos supor que o Formulário principaldo programa A tenha o nome de FormA, então pradetectar 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 doWindows na qual retorna um valor maior do que 0 caso sejaencontrada uma janela que é passada em seus parâmetros..FindWindow(Classe da Janela, Nome da Janela);abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 hencker Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 Outra forma interessante e bem palpável é o uso de "Flags" para indicar a execussão ou não de uma dessas janelas. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 Outra forma interessante e bem palpável é o uso de "Flags" para indicar a execussão ou não de uma dessas janelas.Dá para exemplificar? :huh: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 Outra forma interessante e bem palpável é o uso de "Flags" para indicar a execussão ou não de uma dessas janelas.Dá para exemplificar? :huh:UAEHua é também não conheço essa rsrexplica pra nóis ai kkk Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 hencker Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 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). Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 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).OpaEntão, são opções, mas dentre todas elas acredito que FindWindowainda 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 poucomais complexo mas também é seguro não tem como haver erro..No source principal do programa(Project/View Source) coloque no começovar 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 useientã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 auhahuabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest - Fabiana - Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 Olá...Muito obrigada pela ajuda. Já no primeiro exemplo que você passou deu certo.Tks Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 23, 2007 Denunciar Share Postado Janeiro 23, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
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
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.