Jump to content

Correr apenas 1 programa de cada vez


gadNY
 Share

Recommended Posts

Boas, eu queria saber se é possível não deixar que corram um programa 2 vezes, tipo o fm, quando está a correr avisa que já está a correr.

Eu tentei pesquisar na net, mas assim é muito vago, se me dissessem que método usar eu já pesquisava pelo método.

Link to comment
Share on other sites

Nunca experimentei (isto é, nunca precisei de usar), mas penso que será possível implementar isso com um mutex...

bool novaInstancia;

Mutex mtx = new Mutex(true, "NomeÚnicoParaATuaAplicaçãoQualquerCoisaCompridaParaEvitarColisões", out novaInstancia);

if(novaInstancia)
{
    // executar a aplicação
}
else
{
    // já existe uma instância, sair, ou dar erro, ou...
}

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Pois, mas coloco esse código onde ? não pode ser no programa porque senão só corre quando o programa inicia :s

É suposto só correr quando o programa inicia, né? 😞

Metes no Main() da aplicação. Ora experimenta lá...

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Consegui fazer com este código:

bool novaInstancia;
            Mutex mtx = new Mutex(true, "NOMEDOPROCESSO", out novaInstancia);
            if (novaInstancia)
            {
            }
            else
            {
                MessageBox.Show("Este software já está a ser utilizado.");
                Application.Exit(); 
            }

Mas encontrei outro problema, quando fui ao gestor de tarefas tinha lá um monte de processos da minha aplicação, alguem sabe como termina-los ao fechar o programa ?

Pelo que vi eles não interferem, porque a 1ª vez deixa lançar o programa, a 2ª é que não e se estivessem em execução não deixava por causa deste código acima.

EDIT: Ups, ele não deixa se correr o outro de imediato, mas se esperar uns segundos e correr o programa ele corre :x

EDIT2: Ele no meu computador faz direito, apenas deixa correr 1, mas no outro pc não, acontece o que disse no EDIT :x

EDIT3: esqueçam os outros edits, já percebi onde está o erro, é o seguinte:

Se o programa estiver em "Focus" o código funciona, mas se o programa não estiver em "focus" não funciona o código, ou seja, se minimizar, carregar no ambiente de trabalho etc ele fica aberto mas não em focus, e assim consegue.se abrir os que se quer, isto ocorre em todos os computadores, mesmo no meu.

Ou seja, o melhor mesmo era utilizar a maneira dos processos, mas não percebi o código :S

Link to comment
Share on other sites

mjamado, o que é esse "Mutex" ? é que o C# não está a reconhecer :S

Deduzo que já tenhas visto qual o namespace relevante...

Mas encontrei outro problema, quando fui ao gestor de tarefas tinha lá um monte de processos da minha aplicação, alguem sabe como termina-los ao fechar o programa ?

Isso indica que tens gralha no código, existem por aí uns orfãos... Toma cuidado com BackgroundWorkers e que tais, para não ficarem orfãos - senão ficam a correr.

EDIT3: esqueçam os outros edits, já percebi onde está o erro, é o seguinte:

Se o programa estiver em "Focus" o código funciona, mas se o programa não estiver em "focus" não funciona o código, ou seja, se minimizar, carregar no ambiente de trabalho etc ele fica aberto mas não em focus, e assim consegue.se abrir os que se quer, isto ocorre em todos os computadores, mesmo no meu.

Tens gralha. Acabei de fazer um teste rápido, funciona perfeitamente. Não te esqueças que a aplicação deve ser lançada dentro do if.

Ou seja, o melhor mesmo era utilizar a maneira dos processos, mas não percebi o código :S

O método dos processos é péssima ideia. Para começar, a execução é O(n), sendo n o número de processos; também é verdade que o normal é ter-se 100 a 200 processos, nada que não se percorra muito rapidamente. Seja como for, a execução do Mutex é O(1) - na realidade, deve ser O(m), sendo m o tamanho do nome do Mutex, mas é responsabilidade do sistema operativo, e não do teu código, mas isto são pormenores.

Em segundo lugar, quem quiser mesmo correr duas instâncias do programa, basta mudar o nome do executável - fica com um nome de processo diferente.

Mas o mais grave, a meu ver, é que esse tipo de código deve arranjar problemas a curto prazo com os algoritmos heurísticos dos anti-vírus... Analisar todos os processos existentes de cada vez que arranca? Ou é vírus, ou é spyware...

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

bool novaInstancia;
            Mutex mtx = new Mutex(true, "GestorOcorrências.exe", out novaInstancia);
            if (novaInstancia)
            {
                //Application.Run();
            }
            else
            {
                MessageBox.Show("Este software já está a ser utilizado.");
                Application.Exit(); 
            }

Este é o código que tenho, se deixar estar o application.run(); a funcionar ele não executa a aplicação, dá um erro  a dizer que não posso ter 2, mas se comentar ele funciona na boa, nao percebo porque ontem não estava a dar : o

Muito obrigado pela ajuda, já aprendi mais uma coisa bastante importante 😞

Link to comment
Share on other sites

Isto já vai para aqui uma confusão, mas venho só dizer que este código apenas funciona no windows 7, no Xp não funciona, acontece aquilo que disse por cima, que só funciona quando a aplicação está em 1º plano (focada).

Link to comment
Share on other sites

Logo à noite vejo com mais atenção, mas é possível que seja uma questão do garbage collector.  Penso que assim que o form é lançado, o mutex fica disponível para destruição... e não pode acontecer.

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Pois, mas nisto eu não percebo muito, não consigo perceber a lógica :S

Para isso abres outra posta (ou procura, se calhar já há) que alguém te há-de explicar o que é, para que serve e como funciona o garbage collector; estamos cá para isso.

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Experimenta isto:

bool novaInstancia;
using(Mutex mtx = new Mutex(true, "GestorOcorrências.exe", out novaInstancia))
{
    if (novaInstancia)
    {
        Application.Run();
        // faltam aqui coisas, não?
    }
    else
    {
        MessageBox.Show("Este software já está a ser utilizado.");
        Application.Exit(); 
    }
}

Porquê? Porque, com o using, a variável fica "presa", não disponível para GC, o que poderá resolver o problema. Depois diz alguma coisa (não tenho cá WinXP para testar).

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Penso que não falta nada, o que eu quero aí é que corra a aplicação, apenas isso .

E com esse código não funciona mesmo, corre sempre, e eu onde está aí o "Apllication.Run" não tenho nada, ele corre sem ter nada, apenas dá o erro no else se já estiver a ser utilizado..

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.