[RESOLVIDO] Como impedir duas instâncias do meu programa

11 respostas
P

Tenho um aplicativo em Swing.

Quando rodo meu programa através do .jar, abre minha tela, normal.

Queria que se eu clicasse no .jar de novo, o programa não executasse novamente.

Alguém poderia me ajudar em como fazer isso?

Desde já agradeço a todos

11 Respostas

rc1

Estratégias comuns:

  1. aplicação cria um arquivo de lock (se Java 1.4 ou superior) em um lugar determinado. Novas instâncias falham em obter o lock no arquivo e se recusam a iniciar

  2. aplicação inicia um server socket numa porta determinada. Próxima instância falha ao tentar fazer o mesmo (possivelmente dispara aviso do firewall).

Eclipse usa “1”. Veja também esta thread nos fóruns da Sun:

http://forum.java.sun.com/thread.jspa?threadID=565828&messageID=4101278

P

O que você quer dizer com eclipse usa 1?

maquiavelbona

paulohrl:
O que você quer dizer com eclipse usa 1?

P

Eu entendi o que é o 1, mas o eclipse, pelo que eu sei não usa isso, ele permite rodar mais de uma instância do programa.

maquiavelbona

Procure no workspace do Eclipse um arquivo em .metadata/.lock . Ele não permite mais de uma instância em um workspace. O que terias que fazer é referenciar um único arquivo, que funcionaria de maneira semelhante ao Eclipse.

Até!

P

Mas eu consigo rodar duas instâncias do meu programa ao mesmo tempo no eclipse…

Como seria feito esse controle com o arquivo? quando iniciar o aplicativo eu abro o acesso a esse arquivo? o que me impediria de outra instância também abrir esse acesso?

maquiavelbona

O seu programa teria que criar um arquivo que seria sua chave. Quando iniciar, ele procura esse arquivo e tenta abrir (usando uma API de arquivo blocante, para isso basta procurar um pouco aqui no fórum mesmo) , se conseguir, é porque não existe instância de seu programa rodando, se não conseguir, é porque há instância e aí você mata a execução.

Até!

P

beleza, vou pesquisar um pouco sobre essa API de arquivo blocante, ja que nem imagino do que se trata.

Valew pela ajuda.

maquiavelbona

A API IO padrão do java já é blocante. Se usares NIO não vai funcionar.
Só falei para você procurar porque muitos pedem essa parte já pronta.

Até!

P

implementei usando o pacote java.nio.channels.FileLock; e está funcionando perfeito.

Valew

maquiavelbona

Eu usava File comum. Não sou muito fã de NIO para isso.

Até!

Criado 17 de abril de 2007
Ultima resposta 17 de abr. de 2007
Respostas 11
Participantes 3