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 :

Detecter la fermeture d'un process en JAVA


Sujet :

Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut Detecter la fermeture d'un process en JAVA
    Bonjour,

    Avancement dans mon projet = nouveaux problèmes

    Cette fois-ci on parler de Process

    Je vais commencer par vous montrer mon code.

    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
     
    public static void processDetect() throws IOException
    {
            String line;
            String pidInfo = "";
            String proco = "WINWORD.EXE";
     
            Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe");
     
     
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
     
            while ((line = input.readLine()) != null)
            {
                pidInfo += line;
            }
     
            input.close();
     
            if(!pidInfo.contains(proco))
            {
                int rep = JOptionPane.showConfirmDialog(null, "ATTENTION \n\n\n Le programme n'est plus en cours d'exécution.\n Voulez-vous le relancer ?\n\n", "ATTENTION !!", JOptionPane.YES_NO_OPTION);
     
                if (rep == JOptionPane.YES_OPTION)
                {
                    Process test = Runtime.getRuntime().exec("C:\\Program Files (x86)\\Microsoft Office\\Office14\\WINWORD.EXE");
                    try {
                    	System.out.println("ouvert");
    					test.waitFor();
    					pidInfo += proco;
    					processDetect();
    				} catch (InterruptedException e)
                                    {
    					e.printStackTrace();
    				}
                }
                else
                {
                    System.out.println("Fermer");
                }
            }
            else
            {
            	System.out.println("Déjà ouvert");
            }
    }
    Donc Mon code est cencé détecter que word est lancé ou pas.

    Ce qui marche:

    Quand word n'est pas encore lancé il le détecter et grâce à la boite de dialogue je peux le lancer ou pas. Et si je ferme word il le detecte.

    Ce qui marche pas :

    Quand word est déjà lancé avant l'éxecution du programme il détecte qu'il est lancé mais quand je ferme word il le détecte pas. [help]

    Voilà toute aide sera la bienvenue je suis coincé dans ma logique est un avis extérieur serai pas mal :p.

  2. #2
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    En fouillant vite fait j'ai trouvé 2 méthodes

    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
     
    // Petit code de test
    public static void main( String[] args )
    			 throws IOException, InterruptedException
    {
    	System.out.println( isProcessRunning( "toto.exe" ) );
    	System.out.println( isProcessRunning( "chrome.exe" ) );
     
    	System.out.println( isProcessRunning2( "toto.exe" ) );
    	System.out.println( isProcessRunning2( "chrome.exe" ) );
    }
     
    private static boolean isProcessRunning( String processName )
    			 throws IOException, InterruptedException
    {
    	ProcessBuilder processBuilder = new ProcessBuilder( "tasklist.exe" );
    	Process				 process = processBuilder.start();
    	String				 tasksList = toString( process.getInputStream() );
     
    	return tasksList.contains( processName );
    }
     
    private static String toString( InputStream inputStream )
    {
    	Scanner scanner = new Scanner( inputStream, "UTF-8" ).useDelimiter( "\\A" );
    	String  string = scanner.hasNext() ? scanner.next() : "";
     
    	scanner.close();
     
    	return string;
    }
     
    private static final boolean isProcessRunning2( String processName )
    			 throws IOException
    {
    	String arg = " /nh /fi \"Imagename eq " + processName + "\"";
     
    	ProcessBuilder processBuilder = new ProcessBuilder( "tasklist.exe", "/nh", "/fi", "Imagename eq \"" + processName + "\"" );
    	Process        process = processBuilder.start();
     
    	String         result = toString( process.getInputStream() );
     
    	return result.contains( processName );
    }
    Je te laisse gérer l'ouverture de ton programme le cas échéant

    Cdt.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Nico02 Voir le message
    Salut,

    En fouillant vite fait j'ai trouvé 2 méthodes
    Ok merci je vais voir ce que j'arrive à faire

  4. #4
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Par contre j'ai peut être mal compris ton problème.

    Est-ce que tu veux simplement détecter si ton process est lancé ou non ?

    Ou alors tu veux pouvoir détecter le moment où l'utilisateur ferme effectivement ton programme ?

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut
    Plutot la deuxième solution plus ou moins parceque comme j'ai dit (je reprend l'exemple de word) :

    Si word n'est pas lancé avant mon programme j'ai pas de problème.

    Le problème viens lorsque word est déjà lancé avant que j'éxecute mon programme, il le détecte mais pas ça fermeture.

    est accessoirement j'ai essayé la méthode 1 que tu m'a envoyé elle return false tout le temps

  6. #6
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Je ne sais pas si c'est possible en fait. Enfin pas comme ça.

    Le truc c'est que lorsque que tu lances un programme via un ProcessBuilder (ou Runtime.exec()), la JVM va créer un sous programme qui sera "lié" à elle. C'est ce qui rend l'utilisation de Process.waitFor() possible (enfin je pense, d'autres pourront me corriger si besoin).

    Une autre solution serait, dans le cas ou au lancement de ton programme le Process existe déjà, de lancer un scheduler qui va venir regarder toute les XX secondes si le Process existe toujours (ça on peut le faire).

    C'est pas très propre mais je sais pas si tu as vraiment de choix dans ce cas là.

    Cdt.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut
    Ok Merci de m'avoir accordé du temps je vais continuer mes recherches. Si je trouve quelque chose je le posterais.

  8. #8
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Citation Envoyé par Jaythor Voir le message
    est accessoirement j'ai essayé la méthode 1 que tu m'a envoyé elle return false tout le temps
    Étrange, chez moi ça marche bien pourtant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println( isProcessRunning( "toto.exe" ) );          // --> false
    System.out.println( isProcessRunning( "chrome.exe" ) );     // --> true
    System.out.println( isProcessRunning( "WINWORD.EXE" ) ); // --> true

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut
    après j'ai changé le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String				 tasksList = toString( process.getInputStream() )
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String				 tasksList = process.getInputStream().toString
    parce qu'il me renvoyais une erreur comme quoi il faillait une méthode toString(String) un truc dans le genre

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 46
    Points : 144
    Points
    144
    Par défaut process listener
    Alors j'ai trouvé quelque chose qui à l'air de marché c'est un peu tordu mais ça marche .

    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
     
    public class ProcessDetect
    {
     
        public static void processDetect() throws IOException, InterruptedException
        {
        	boolean a;
     
        	if (isProcessRunning("WINWORD.EXE") == true)
            {
            	System.out.println("yes");
            	a = true;
            	setTest(a);
            }
            else
            {
            	System.out.println("no");
            	a = false;
            	setTest(a);
            	int rep = JOptionPane.showConfirmDialog(null, "ATTENTION \n\n\n Le programme n'est plus en cours d'exécution.\n Voulez-vous le relancer ?\n\n", "ATTENTION !!", JOptionPane.YES_NO_OPTION);
     
            	if (rep == JOptionPane.YES_OPTION)
                {
                    Process test = Runtime.getRuntime().exec("C:\\Program Files (x86)\\Microsoft Office\\Office14\\WINWORD.EXE");
                    try {
    					test.waitFor();
    					processDetect();
    				} catch (InterruptedException e)
                    {
    					e.printStackTrace();
    				}
                }
                else
                {
                    System.out.println("word déactivé")
                }
            }
     
     
     
     
        }
     
     
     
    	private static boolean isProcessRunning(String processName) throws IOException, InterruptedException
    	{
    		String line;
    		String pidInfo = "";
     
    		Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe");
     
    		BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
     
    		while ((line = input.readLine()) != null)
            {
                pidInfo += line;
            }
     
    		if (pidInfo.contains(processName))
    		{
    			p.destroy();
    			return true;
    		}
    		else
    		{
    			p.destroy();
    			return false;
    		}
    	}
     
     
    	public static boolean test;
     
    	public static void setTest(boolean test)
    	{
    		ProcessDetect.test = test;
    	}
     
    	public static boolean getTest()
    	{
    		return test;
    	}
     
     
    }

    et le main avec le timer

    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
     
    public static void main(String[] args)
    	{
    		Timer minuteur = new Timer();
    		TimerTask tache = new TimerTask() {
     
    			@Override
    			public void run() {
    				try {
    					ProcessDetect.processDetect();
    					if (ProcessDetect.getTest() == false)
    					{
    						minuteur.cancel();
    					}
    				} catch (IOException | InterruptedException e) {
    					// TODO Auto-generated catch block
    					System.out.println("oups");
    				}
     
    			}
    		};
     
    		minuteur.schedule(tache, 0, 500);
     
    	}
    en gros il va check tous les processus toutes les 1/2 seconde pour voir si le process qui nous interesse est là ou pas c'est un peu un process listener que j'ai cherché à faire.

    et donc si word est déjà lancé avant le programme il le détecte et il détecte sa fermeture.

    Donc ça marche

    Merci pour ton aide tes pistes mon bien aidé.

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

Discussions similaires

  1. Detecter la fermeture du navigateur
    Par keumlebarbare dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/10/2006, 11h44
  2. Réponses: 8
    Dernier message: 21/06/2006, 14h43
  3. Réponses: 5
    Dernier message: 28/04/2006, 18h45
  4. Réponses: 7
    Dernier message: 12/10/2005, 09h19
  5. Detecter la fermeture d'une fenetre MsDos
    Par Akta3d dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/07/2004, 16h53

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