Empêcher de relancer la même app[Java]

Fermé
Lucie - Modifié par Lucie le 12/11/2011 à 12:43
 Lucie - 12 nov. 2011 à 14:59
Coucou,

je cherche un moyen d'empecher le relancement de la même appli java tant que cette derniere est encore en cours d'execution !

Est-ce tout simplement possible... ?

Merci,
Lucie



A voir également:

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 nov. 2011 à 13:49
Non c'est possible, mais il faut tricher un peu (en particulier pour rester multiplate-forme).
Voici une solution simple mais pas forcément très élégante :

Au démarrage du premier programme, tu créés un fichier avec un nom connu d'avance par exemple dans le répertoire des fichiers temporaires (le fichier peut être vide)
Au lancement d'un deuxième programme, tu regarde si le fichier existe, et puisque c'est le cas tu lui interdit de s'exécuter d'avantage et tu fermes le deuxième programme.
À l'arrêt du premier programme, tu supprimes le fichier pour une utilisation ultérieure.

Avantage : c'est assez simple à mettre en place et en général ça fonctionne.
Inconvénient : si ton programme plante et que le fichier n'est pas supprimé, aucun autre programme ne pourra plus être créé.

Amélioration : on pourrait créer un thread qui dort la plupart du temps et qui se réveille par exemple une fois par minute pour écrire dans ce fichier l'heure qu'il est.
Le deuxième programme regarde si le fichier existe et vérifie l'heure qui est indiquée, si l'heure est plus ancienne que deux minutes, alors le premier programme s'est interrompu sans avoir supprimé le fichier. Dans ce cas on autorise l'application a se lancer.

Avantage : ça reste simple à mettre en place et ça résout le problème de tout à l'heure.
Inconvénient : si le programme plante, il faut attendre deux minutes pour le relancer.

Une alternative plus propre, mais plus compliqué à mettre en place, c'est d'utiliser jps, le gros inconvénient, c'est qu'il n'est installé qu'avec la JDK. Donc chez un utilisateur lambda qui n'a que la JRE, on ne pourra pas lister les processus de la JVM. Mais il existe peut-être des équivalents de jps qui tournent sur la JRE, il faudrait approfondir.
0
Salut !

Ta solution est ingénieuse et est,effectivement très facile à mettre en place.


Je pense avoir néanmoins trouvé une solution supplémentaire

J'ai stocké la liste des process windows dans une liste

(j'ai utilisé ce site pour comprendre :

http://www.rgagnon.com/javadetails/java-0593.html

)

ensuite je pourrais faire un bête test si result.contains ("Le process que tu veux);


Mais Effectivement ce n'est pas multiplateforme ( mais à la base mon application ne fonctionnait déjà que sur windows :p
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 nov. 2011 à 14:50
Je ne suis pas sûr que la liste des processus du système distingue chaque application Java.
Je pense qu'il va lister la JVM mais c'est tout, sans savoir ce qui tourne à l'intérieur.
Il n'y a qu'en testant que tu le sauras, mais cela reprend le principe de jps.

Remarque : faire du Java et ne pas le faire multiplate-forme c'est mal ^^
0
Cela fonctionne ! encore quelques petits bugs à regler mais ca devrait aller ;)

Je développe un petit projet perso qui utilise des commandes windows en fait, du coup il n'est pas portable, mais je pourrais le rendre générique !

Dans une prochaine MAJ peut être ;p

Merci
0