Como impedir q o programa seja aberto + de 1 vez?

Desculpe entrar atrasado no ônibus e querer sentar na janelinha, mas não tem jeito de eu verificar se já existe uma instância do objeto na memória simplesmente? Se tiver como faço? Tipo tem como dar um “focus” no objeto que já está na memóira?

Ixi não dah pra fazer facilmente como se faz no windows, o jeito (pelo q li em outros forums) é usar Sockts, mas estava pensando em uma solução para o focus, cv, Luca e o pessoal mais fera em java, vejam se isto é viável:

Deixar uma porta de escuta no programa, aí se quando o programa for abrir novamente ele verifica se a porta estiver aberta, se estiver manda uma mensagem (ai naum sei o protocologo, pode ser UTB q é bem simples) para o programa, o programa interpreta a mensagem e dá foco em si mesmo, (acho q tem como dar foco no programa próprio neh?)

bom eu naum pude testar isso, mas talvez irá precisar usar duas porta, ou talvez apenas uma para “escutar”, dai se ela estiver sendo usada, usa a mesma porta para enviar a mensagem, sei lá pode ser…

Eu jah fiz isso. Funciona, na boa…

Não é dificil não… eu tenho até uma API que eu uso em uns 3 projetos meus q usam isso.

VELO

Identificar se uma instância já existe?

Primeiro você precisa definir o que é igualdade para seu objeto. nesse caso, igualdade não é a mesma posição em memória, então procure sobrescrever o método equals.

Depois, você vai ter que ter um objeto que faz essa pesquisa. Uma Factory pode receber parâmetros e checar se um objeto com estes parâmetros já existe antes de criá-lo, mantendo uma rafer~encia á eles. Tipo:

class FactoryABC{

static Map isntancias = new HashMap();

public MeuObjeto criar(int parametroQualquer){

 if(! instancias.containsKey(parametroQualquer) ) {
ualquer);
 instancias.put(parametroQualquer, novo);
 }

  return instancias.get(parametroQualquer);
 
}

}

Estava com esse problema hoje pela manha e consegui resolve-lo de uma forma q não sei se eh tão segura e eficiente…

usei o metodo do arquivo. Sempre q o programa for iniciado ele cria uma “trava”(arquivo) e sempre q fechado a trava é destruida. O problema como eu li aqui é que caso haja um KILL a trava nunca sera destruida e o programa nunca sera executado novamente acusando que já tem um em execução mas…
Usei o addShutdownHook do Runtime pra assim que a JVM for encerrada a trava ser destruida tambem. Ate agora funcionou sem problemas não fiz muitos testes. Será que dessa forma há alguma coisa que bugue muito?

valeu ae :slight_smile:

Não porque ao iniciar uma nova copia do programa uma nova JVM será aberta. E ai a memoria de uma não tem acesso à da outra. Se vc se refere à memoria da máquina , vc teria que implementar algo via JNI para isso e brincar com a memória é sempre ruim. Vc tb poderia fazer as memorias comunicarem, mas ai vc cai no mecanismo de sockets.

Olá

Neste e em outros tópicos já foi explicado porque a complexa solução de travar um arquivo não é adequada e porque a solução simples de abrir um socket funciona a contento. O código já foi até publicado em mais de um tópico.

[]s
Luca