Impedir que se abra o aplicativo que já estyiver em execução

Olá,

Alguém saberia me responder como faço para evitar que um aplicativo em execução se abra novamente?

Obrigado.

que aplicativo? um desenvolvido por vc tipo em swing?

sim, um aplicativo desenvolvido por mim com Swing…

abre o programa, cria um arquivo em algum lugar… por exemplo “programa.lock”…

ao abrir seu aplicativo vc testa para ver se existe este arquivo, se existir vc nao abre :slight_smile:

alguem tem outra sugestão? :wink:

se for usar esta dica nao esqueça de fazer um window listener para deletar o arquivo no fechar da janela senao seu programa nao abrira mais… :lol:

É mais isso daí pode ter um probleminha.

Por exemplo, se a máquina do usuário desligar com uma queda de energia…Lá vai o suporte sair removendo arquivo de bloqueio.

O ideal seria se a máquina virtual conseguisse identificar a aplicação. :roll:

Vixe agora também quero saber como…

:?:

A Paz!!

Será que um System.setProperty() não funciona?

Tentei isso:

public class A { public static void main( String[] args ) { System.out.println("Status: "+System.getProperty("motherfucker")); if( System.getProperty("motherfucker") != null ) { System.out.println("Already running... bye!"); return; } System.setProperty("motherfucker","ready"); System.out.println("Status: "+System.getProperty("motherfucker")); try { Thread.sleep(15000); } catch( Exception e ) {} System.out.println("bye!"); } }

Mas não funcionou! :cry:

Olá

Ao entrar na aplicação tente abrir um ServerSocket com uma porta maluca qualquer. Trecho de exemplo:

try { ServerSocket ss = new ServerSocket(qqport); ss.close(); // conseguiu!!!, estou sozinho } catch (IOException ex) { // Não conseguiu, já tem outro aberto }

[]s
Luca

Uma solução mais louca que a outra.
UHAUahuAHUAuAhuahuhUAhUAhuauAuhUAHuA…

[quote=Luca]Olá

Ao entrar na aplicação tente abrir um ServerSocket com uma porta maluca qualquer. Trecho de exemplo:

try { ServerSocket ss = new ServerSocket(qqport); ss.close(); // conseguiu!!!, estou sozinho } catch (IOException ex) { // Não conseguiu, já tem outro aberto }

[]s
Luca[/quote]

Putz, mais que gato!!! :shock: :shock: :shock: :shock: :shock:

:lol: :lol:

A Paz!!

Naum existem uma maneira de gravar alguma coisa na RAM?

Um objeto, ou um arquivo, sei lah…

Tipo um disco virtual, mas sem precisar iniciar esse serviço no SO…

Duas VMs diferentes? Nope.

[]s

Você sabe que isso é meio chato de fazer, mesmo em um programa 100% C++. Em C++ e ambiente Windows, por exemplo, não funciona bem aquela história de criar uma janela escondida com um determinado título e checar se a janela já existe - às vezes isso não dá certo. (principalmente para aqueles caras mais impacientes, que dão um “multiple-click” para iniciar um programa.) Eu em particular acho que isso deveria ser gerenciado pelo sistema operacional (onde você deixaria apenas uma cópia por máquina, ou uma cópia por usuário).

O esquema do arquivo de “lock” é bem estilão Unix, e como no Unix, de vez em quando dá pau. Você pode até tentar um esquema com java.nio e usar FileLock - criar um arquivo, se não existir, e associar um “lock” a ele; se não conseguir fazer o lock, então é porque uma cópia do aplicativo já deve estar rodando. Se o aplicativo sair do ar, o lock será liberado do arquivo.

Olá

Insisto, o esquema dos sockets funciona legal. Usamos isto no Banco Postal e nunca deu problemas. Antes usávamos lock de arquivos (feito na mão porque era j2sdk 1.3.1) e deu problemas.

[]s
Luca

Beleza, porque portas em sockets são o único recurso global “garantido” de existir em qualquer sistema operacional decente (com rede, é claro) que o Java suporta.
Obrigado pela informação.
Só completando, sempre se lembrar que a tal “porta maluca” não pode ser menor que 1024 ou 5000 (agora não sei o número certo) porque isso costuma dar problemas com Unix / Linux e usuários não administrativos (root).

[quote=thingol]
Só completando, sempre se lembrar que a tal “porta maluca” não pode ser menor que 1024 ou 5000 (agora não sei o número certo) porque isso costuma dar problemas com Unix / Linux e usuários não administrativos (root).[/quote]

tem que ser > 1024

[]s

[quote=Luca]Olá

Insisto, o esquema dos sockets funciona legal. Usamos isto no Banco Postal e nunca deu problemas. Antes usávamos lock de arquivos (feito na mão porque era j2sdk 1.3.1) e deu problemas.

[]s
Luca[/quote]

e se o cara tem um firewall corporativo chato?

[quote=microfilo]
e se o cara tem um firewall corporativo chato?[/quote]

Só se o tal firewall estiver na máquina do aplicxativo, porque o que o Luca sugeriu foi um loopback.

[]s

Acho que esse eh o caso em que se necessita uma solução em JNI… :frowning: