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 :

Comment savoir si l'appli est déjà lancée? [FAQ]


Sujet :

Java

  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Comment savoir si l'appli est déjà lancée?
    Salut,

    Je cherche une solution pour savoir si l'appli est déjà lancée. Par exemple, je crée une application Appli, et si je la lance alors qu'elle est déjà lancée dans le système, je veux que ça ouvre la fenêtre déjà lancée et non que ça lance une 2e fois le programme.
    Et de préférence, tout en restant multiplateforme, bien sur

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Pour savoir si une application est déja lancée, personnellement j'ouvre un socket sur un port au début de l'application et si je n'y arrive pas, ca veut dire que l'appli est déja lancée. Mais faut faire attention à prendre un port qui n'est pas utililisé par une appli du réseau. Et ce n'est pas très optimal...

    Tu peut aussi créer un fichier à l'ouverture s'il n'existe pas et le supprimmer à la fermeture, ainsi lors du lancement, si le fichier existe, ca veut dire qu'une autre instance de ton programme est lancée, sinon tu peut le lancer.

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par wichtounet
    Pour savoir si une application est déja lancée, personnellement j'ouvre un socket sur un port au début de l'application et si je n'y arrive pas, ca veut dire que l'appli est déja lancée. Mais faut faire attention à prendre un port qui n'est pas utililisé par une appli du réseau. Et ce n'est pas très optimal...

    Tu peut aussi créer un fichier à l'ouverture s'il n'existe pas et le supprimmer à la fermeture, ainsi lors du lancement, si le fichier existe, ca veut dire qu'une autre instance de ton programme est lancée, sinon tu peut le lancer.
    J'avais pensé à la 2e solution, le pb c'est que si l'appli plante (ou le pc reboot), le fichier reste sur le ddur... Et donc au prochain démarrage, il va pas vouloir lancer une nouvelle instance...

    Pour la première, ça doit marcher, mais bon, ça me paraît un peu gros pour juste voir si c lancé... Il doit y avoir une solution plus "simple" non?

  4. #4
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par ®om
    J'avais pensé à la 2e solution, le pb c'est que si l'appli plante (ou le pc reboot), le fichier reste sur le ddur... Et donc au prochain démarrage, il va pas vouloir lancer une nouvelle instance...

    Pour la première, ça doit marcher, mais bon, ça me paraît un peu gros pour juste voir si c lancé... Il doit y avoir une solution plus "simple" non?
    La première solution est encore plus simple que la deuxième à mettre en oeuvre

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try{ new ServerSocket(12345); }
    catch(Exception e){
    //Si il est ouvert, on affiche un message et on quitte le programme
    JOptionPane.showMessageDialog(null, "Ce programme est déja ouvert");
    System.exit(0);
    }

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Par défaut
    Pourquoi ne pas utiliser un singleton ?
    Ca sert a ça non ?

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par wichtounet
    La première solution est encore plus simple que la deuxième à mettre en oeuvre

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try{ new ServerSocket(12345); }
    catch(Exception e){
    //Si il est ouvert, on affiche un message et on quitte le programme
    JOptionPane.showMessageDialog(null, "Ce programme est déja ouvert");
    System.exit(0);
    }
    Oui, plus simple au niveau du code, mais bon ça fait un socket d'ouvert juste pour ça... Mais en y réfléchissant, c'est pas si mal...

  7. #7
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par e1lauren
    Pourquoi ne pas utiliser un singleton ?
    Ca sert a ça non ?
    Non ca sert pas à ca...

    Un singleton permet de n'avoir qu'une seule instance à l'intérieur d'un programme, mais ne permet pas de savoir depuis un autre programme si une instance est déja ouverte.

    Citation Envoyé par ®om
    Oui, plus simple au niveau du code, mais bon ça fait un socket d'ouvert juste pour ça... Mais en y réfléchissant, c'est pas si mal...
    Ben, c'est sur qu'il faut faire attention sur quel port tu l'ouvre, tu vas pas essayer d'ouvrir un socket sur le port 80 Par exemple le port 12345, ca m'étonnerait qu'il soit utilisé quelque part

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par e1lauren
    Pourquoi ne pas utiliser un singleton ?
    Ca sert a ça non ?
    Singleton c pour une instance d'une classe au sein d'un programme java... Pas du même programme lancé plusieurs fois

  9. #9
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    bonjour à tous,

    J'ai essayé la soluce de wichtounet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public class Manager
    {
        /** port permettant d'assurer une unique instance de ITaskManagerUI */
        private static int   PORT                 = 12345; 
     
        public static void main(String[] args)
        {   
            try
            {   new ServerSocket(PORT); 
                /* création d'un ITaskManager */
                infass.util.schedule.ITaskManager manager = new infass.util.schedule.ITaskManager();
                manager.execute();
                System.out.println("Instance du programme unique"); 
            }
            catch(Exception e)
            {   System.out.println("Il y a deja une instance du programme active"); 
                System.exit(0); 
            }
        }
    }
    Après avoir configuré norton, pour qu'il arrête de s'exciter, je peux toujours lancer deux instances du programme???

    quelqu'un pourrait-t-il m'aiguiller?

  10. #10
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Essaie avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class Manager
    {
        /** port permettant d'assurer une unique instance de ITaskManagerUI */
        private static int   PORT                 = 12345; 
        private static ServerSocket socket = null;
     
        public static void main(String[] args)
        {   
            try
            {   socket = new ServerSocket(PORT); 
                /* création d'un ITaskManager */
                infass.util.schedule.ITaskManager manager = new infass.util.schedule.ITaskManager();
                manager.execute();
                System.out.println("Instance du programme unique"); 
            }
            catch(Exception e)
            {   System.out.println("Il y a deja une instance du programme active"); 
                System.exit(0); 
            }
        }
    }
    Ca devrait empêcher que le gc ne détruise ta référence au socket et ainsi qu'il ne se ferme pas.

    P.S. Je suis en train de faire quelque chose d'un peu plus puissant pour gérer une seule instance, dès qu'une instance se lance et qu'il y en a déja une autre, l'ancienne instance se met à clignoter dans la barre des tâches. Je vais bientôt mettre la source à dispo quand elle sera plus optimisée

  11. #11
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    exact, j'avais pas pensé à ca .

    merci wichtounet !!

  12. #12
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Salut,

    Ma question était très ancienne, entre temps je l'avais résolu.

    D'ailleurs, voici ma solution:
    http://www.developpez.net/forums/sho...d.php?t=148068 (dernière réponse)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    package org.myfreetv.view;
     
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    import java.util.logging.Logger;
     
    import javax.swing.SwingUtilities;
     
    /**
     * Cette classe permet d'assurer l'unicité de l'instance de MyFreeTV. Deux applications MyFreeTV ne peuvent pas être
     * lancées simultanéement.
     * 
     * @author rom1v
     */
    final class UniqueInstanceTester {
     
        /** Pour utilisé pour l'unique instance de MyFreeTV. */
        private static final int PORT = 27321;
     
        /** Interdiction d'instancier. */
        private UniqueInstanceTester() {}
     
        /**
         * Donne le focus à l'éventuelle application MyFreeTV déjà lancée.
         * 
         * @return {@code true} si aucune autre instance de MyFreeTV n'existe.
         */
        public static boolean launch() {
     
            /* Indique si l'instance de MyFreeTV est unique. */
            boolean unique;
     
            try {
                /* On crée une socket sur le port défini. */
                final ServerSocket server = new ServerSocket(PORT);
     
                /* Si la création de la socket réussi, c'est que l'instance de MyFreeTV est unique, aucune autre n'existe. */
                unique = true;
     
                /* On lance un Thread d'écoute sur ce port. */
                Thread portListenerThread = new Thread() {
     
                    @Override public void run() {
                        /* Tant que l'application MyFreeTV est lancée... */
                        while(true) {
                            try {
                                /* On attend qu'une socket se connecte sur le serveur. */
                                final Socket socket = server.accept();
     
                                /* Si une socket est connectée, on écoute le message envoyé dans un nouveau Thrad. */
                                new Thread() {
     
                                    @Override public void run() {
                                        receive(socket);
                                    }
                                }.start();
                            } catch(IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                };
     
                /* Le Thread d'écoute de port est démon. */
                portListenerThread.setDaemon(true);
     
                /* On démarre le Thread. */
                portListenerThread.start();
            } catch(IOException e) {
                /* Si la création de la socket échoue, c'est que l'instance de MyFreeTV n'est unique, une autre n'existe. */
                unique = false;
     
                /* Dans ce cas, on envoie un message à l'autre application pour lui demander d'avoir le focus. */
                send();
            }
            return unique;
        }
     
        /**
         * Envoie un message à l'instance de l'application déjà ouverte.
         */
        private static void send() {
            PrintWriter pw = null;
            try {
                /* On se connecte sur l'ip locale. */
                Socket socket = new Socket("localhost", PORT);
     
                /* On définit un PrintWriter pour écrire sur la sortie de la socket. */
                pw = new PrintWriter(socket.getOutputStream());
     
                /* On écrit "myfreetv" sur la socket. */
                pw.write("myfreetv");
            } catch(IOException e) {
                Logger.getLogger("MyFreeTV").warning("Écriture sur flux de sortie de la socket échoué.");
            } finally {
                if(pw != null)
                    pw.close();
            }
        }
     
        /**
         * Reçoit un message d'une socket s'étant connectée au serveur d'écoute. Si ce message est "{@code myfreetv}",
         * l'application demande le focus.
         * 
         * @param socket
         *            Socket connecté au serveur d'écoute.
         */
        private static void receive(Socket socket) {
            Scanner sc = null;
     
            try {
                /* On n'écoute que 5 secondes, si aucun message n'est reçu, tant pis... */
                socket.setSoTimeout(5000);
     
                /* On définit un Scanner pour lire sur l'entrée de la socket. */
                sc = new Scanner(socket.getInputStream());
     
                /* On ne lit qu'une ligne. */
                String s = sc.nextLine();
     
                /* Si cette ligne est "myfreetv"... */
                if("myfreetv".equals(s)) {
     
                    /* On demande le focus dans l'EDT. */
                    SwingUtilities.invokeLater(new Runnable() {
     
                        public void run() {
                            /* On récupère la fenêtre principale de l'application. */
                            MainFrame mainFrame = MyFreeTV.getMyFreeTV().getMainFrame();
     
                            /*
                             * La fenêtre peut ne pas être encore ouverte (très peu probable), par exemple au tout début du
                             * démarrage de l'application.
                             */
                            if(mainFrame != null) {
                                /* Si elle n'est pas visible (uniquement dans le systray par exemple), on la rend visible. */
                                if(!mainFrame.isVisible())
                                    mainFrame.setVisible(true);
                                /* On demande à la mettre au premier plan. */
                                mainFrame.toFront();
                            }
                        }
                    });
                }
            } catch(IOException e) {
                Logger.getLogger("MyFreeTV").warning("Lecture du flux d'entrée de la socket échoué.");
            } finally {
                if(sc != null)
                    sc.close();
            }
        }
     
    }
    Pour plus de facilité de lecture: UniqueInstanceTester

  13. #13
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    A noter que si vous déployer via Java Web Start vous pouvez utiliser le SingleInstanceService...

    a++

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

Discussions similaires

  1. DOS BATCH comment savoir si un programme est déjà lancé ?
    Par ritchie23 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 21/10/2008, 20h37
  2. Réponses: 20
    Dernier message: 18/05/2008, 17h33
  3. Réponses: 2
    Dernier message: 15/09/2006, 00h35
  4. Comment savoir si une application est lancée ?
    Par Teddy dans le forum Delphi
    Réponses: 2
    Dernier message: 02/07/2006, 20h33
  5. Réponses: 6
    Dernier message: 01/07/2005, 16h06

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