IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Une seule instance d'un même programme java [FAQ]


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 17
    Par défaut Une seule instance d'un même programme java
    Je voudrais savoir si il est possible d'empêcher l'utilisateur de lancer plusieurs fois le même .jar.
    En bref il lance une première fois le programme, si il le lance une deuxième fois alors que celui ci tourne encore, le programme ne se lance pas de nouveau.

    Merci d'avance

  2. #2
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Une solution classique est de mettre un conteur static au niveau de ta classe principal et d'incrémenter ce compteur. Etant static, il est partagé par toutes les instances de la classe. Tu peut donc savoir combien de fois ta classe est lancée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class principal
    {
    private static cpt = 0;
     
    public static void main (String [] arg)
    {
      cpt++;
      if(cpt > 1)
      {
         System.exit(0);
      }
    }

  3. #3
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par woodwai
    Une solution classique est de mettre un conteur static au niveau de ta classe principal et d'incrémenter ce compteur. Etant static, il est partagé par toutes les instances de la classe. Tu peut donc savoir combien de fois ta classe est lancée

    public class principal
    {
    private static cpt = 0;

    public static void main (String [] arg)
    {
    cpt++;
    if(cpt > 1)
    {
    System.exit(0);
    }
    }
    Désolé mais pour ce cas cette solution ne peut pas marcher.
    Chaque jar est lancé par une instance de JVM différente. Or chaque instance de JVM est indépendante et donc ne peut pas avoir accès aux classes instanciées au sein d'autres instances de JVM.
    Bobo59, pour une solution possible pour ton problème, va voir la FAQ.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 17
    Par défaut
    Merci pour ta reponse, pour une fois où je n'ai pas été voir la FAQ...
    ...promis je ne recommencerai pas

  5. #5
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Normalement Descent, si on utilise le même JAR on est dans la mêm JVM et donc celà marche (je croit bien que c'est le cas de Bobo59).
    J'ai déjà mis en place ce type de sécurité pour une appli swing que je ne voulait pas que l'on puisse lancer deux fois du même PC.

    Dans le cas de deux JVM différentes, il y a aussi l'utilisation d'un fichier (comme ce que font beaucoup de programmes) :
    - tu écrit dans un répertoire de ton appli - ou un répertoire temporaire - un fichier par expemple .pid que tu supprimera au destroy de ton application.
    - au démarrage, avant d'écrire ton fichier, tu vérifie sa présence, si il est là tu arrête car celà veut dire que l'application s'est lancée deux fois.

    Le problème de ce système est que si le destroy de l'application se passe mal, le fichier reste et l'application refusera de se relancer (j'ai déjà eu le cas avec postgresSQL qui utilise/utilisait ce type de sécurité).
    Mais au moins ça évite d'ouvrire une socket pour rien!

  6. #6
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Le cas de Bobo59 c'est qu'il veut empêcher plusieurs lancements d'un même jar.

    Fais le test. Lance un jar deux fois de suite et controle les processus lancés dans le gestionnaire de tâches.

    Tu y verra deux processus javaw preuve qu'il y a bien 2 instances différentes de la JVM qui sont lancés.

    Sinon, c'est vrai que la solution de la FAQ n'est peut être pas la plus immédiate et que la solution du fichier temporaire peut être une alternative.

    D'ailleurs, je trouve que ce serait pas mal de rajouter la solution du fichier temporaire dans la FAQ

  7. #7
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Citation Envoyé par Descent
    Chaque jar est lancé par une instance de JVM différente.
    Je ne suis pas du tout d'accord avec toi, en effet, dans une même application, tout les JAR sont lancé par la même JVM (sinon ils ne pourraient pas accéder les uns aux autres).

    Par contre, différentes application utilisent différentes JVM/instances de JVM, ce qui n'est pas du tout la même chose.

  8. #8
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par woodwai
    Je ne suis pas du tout d'accord avec toi, en effet, dans une même application, tout les JAR sont lancé par la même JVM (sinon ils ne pourraient pas accéder les uns aux autres).

    Par contre, différentes application utilisent différentes JVM/instances de JVM, ce qui n'est pas du tout la même chose.
    Je me suis mal exprimé sur ce coup là.

    Je parlais des jars exécutables.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ne démarrer qu'une seule instance du programme
    Par gilweb dans le forum VB.NET
    Réponses: 9
    Dernier message: 17/04/2014, 10h19
  2. Une seule instance partagée avec plusieurs programmes
    Par CZVF_RS dans le forum Langages
    Réponses: 4
    Dernier message: 29/05/2013, 22h53
  3. Une seule instance du programme Win 2003 Serveur
    Par Erakis dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/11/2007, 14h57
  4. [FAQ] une seule instance de mon programme
    Par kacedda dans le forum C#
    Réponses: 6
    Dernier message: 01/02/2007, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo