Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/05/2008, à 12:27

psyrio

Java, et gerer les fermetures de programme

Bonjour,

Mon titre de sujet est un peu vague mais je ne savais pas comment specifier cela.

Voila j'ai un programme qui doit ouvrir des fichiers celon leur extensions pour pouvoir les modifiers, pour cela j'utilise un thread pour lancer dans le run la classe Desktop et la methode open qui ouvre le fichier passer en argument celon les programmes enregistre sur le PC.

Mon code:

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
	
	
	
	public class MonThread extends Thread{
		
		
		private String ch;
		public MonThread(String f){
			ch= new String(f);
		}
		
		public void run() {
		  
			//if ( Desktop.isDesktopSupported() ) {
				Desktop desktop = Desktop.getDesktop();            			
				// On vérifie que la fonction open est bien supportée :
				if (desktop.isSupported(Desktop.Action.OPEN)) {            				
					// on lance l'application associé au fichier pour l'ouvrir :
					try {
						System.out.println(ch);
						desktop.open( new File(ch) );
						System.out.println("jai ouvert");
					}
					catch (IOException e) {
						e.printStackTrace();
					}
					catch(IllegalArgumentException e) {
						e.printStackTrace();
					}
				}
				
			}
			
}

Mais j'ai un problème, je dois arriver à détecter la fermeture du programme lancé et je ne sais pas comment faire, et sur internet après une recherche sur Google, je n'ai pas reussi à trouver une solution. J'utilise le langage JAVA sous Ubuntu Hardy: si cela peut aider.

Pourriez vous m'aider à résoudre ce problème pour que je puisse fermer mon thread quand le programme lancé se ferme. Dans le meilleur des cas, si je pouvais savoir aussi si l'utilisateur a sauvegardé son fichier ou non serait un grand plus pour mon projet.

big_smile Merci bien

Hors ligne

#2 Le 01/06/2008, à 18:56

nalian34

Re : Java, et gerer les fermetures de programme

jette un coup d'oeil sur la méthode join() de la classe Thread

Hors ligne

#3 Le 02/06/2008, à 10:37

psyrio

Re : Java, et gerer les fermetures de programme

Merci cela bloque bien le thread principale par contre comment faire pour ferme le thread que j'ai lancer ou je ouvre le programme celon le fichier, car je veu q'uil se termine quand je ferme le programme.

Hors ligne

#4 Le 02/06/2008, à 18:53

nalian34

Re : Java, et gerer les fermetures de programme

si on résume tu as une classe principale qui fait:

public class Launcher{
    
    public static void main(String args[]) throws IOException, InterruptedException{      
        MonThread t = new MonThread("temporary");
        t.start();
        t.join();
        System.out.println("fini");
    }
}

et tu veux que "fini" s'affiche à l'écran une fois que l'utilisateur a fermé l'éditeur de texte? c'est bien ça?

Hors ligne

#5 Le 02/06/2008, à 18:56

psyrio

Re : Java, et gerer les fermetures de programme

En version simple oui, normalment je devrai aussi detecter si il a sauvegarder ou pas. E quand il ferme l'editeur je doi envoyer le fichier quil a modifier sur le pc distant

Hors ligne

#6 Le 02/06/2008, à 19:53

nalian34

Re : Java, et gerer les fermetures de programme

la seule idée qui me vient c'est de lister les processus qui tournent avant d'ouvrir ton éditeur, de comparer avec la liste des processus une fois que l'éditeur est ouvert et puis de vérifier à interval régulier si le processus est toujours actif.

j'ai essayé la commande suivante

Runtime.getRuntime().exec("touch process.txt");
Runtime.getRuntime().exec("ps -All >> process.txt");

qui normalement doit écrire dans process.txt la liste des processus en cours mais je ne sais pas pourquoi ça ne marche pas

Dernière modification par anirelles (Le 02/06/2008, à 19:55)

Hors ligne

#7 Le 02/06/2008, à 19:58

®om

Re : Java, et gerer les fermetures de programme

Essaye :

Runtime.getRuntime().exec("sh \"ps -All >> process.txt\"");

Hors ligne

#8 Le 02/06/2008, à 20:04

psyrio

Re : Java, et gerer les fermetures de programme

Mais si je doi comparer tuo le temps jai pa besoin du thread alors si?

Hors ligne

#9 Le 02/06/2008, à 21:43

nalian34

Re : Java, et gerer les fermetures de programme

®om a écrit :

Essaye :

Runtime.getRuntime().exec("sh \"ps -All >> process.txt\"");

ça marche pas plus de mon côté hmm

Hors ligne

#10 Le 02/06/2008, à 22:19

Totor

Re : Java, et gerer les fermetures de programme

Il y a bien longtemps que je n'ai as fait de dév en java. je ne peux donc pas m'avancer dans les "détails".

Mais dans le principe, n'est-il pas possible d'ouvrir ton fichier de façon synchrone ? auquel cas ton thread pourrait se soucider (ou demander à son père de devenir un meurtrier wink) lorsque l'éditeur se ferme ...

D'autres part, n'existe t'il pas des classes java permettant de gérer des événements sur des fichiers tel que peux le faire inotify ? dès lors, cela te permetterai de savoir si le fichier est fermé ou mieux encore, enregistré ?

D'ailleurs, au pire, tu peux peut-être t'interfacer avec inotify : http://en.wikipedia.org/wiki/Inotify

Par ailleurs, cette histoire de lister les processus ne répond pas à tous les cas possible : certains éditeurs de texte ne se réinstancient pas lorsqu'on demande d'ouvrir un fichier, même si c'est un processus différent qui est à l'origine de la demande. cela signifie que le programme n'est pas rechargé en mémoire s'il l'est déjà. Il se peut donc que la demande d'ouverture du fichier soit prise en compte par une application déjà ouverte. La liste des processus reste alors inchangée.

Dernière modification par Totor (Le 02/06/2008, à 22:20)


-- Lucid Lynx --

Hors ligne

#11 Le 04/06/2008, à 08:49

psyrio

Re : Java, et gerer les fermetures de programme

Oui mais initofy ne permet pas de savoir exactement qd un programme ce ferme si?

De plus pour la methode du distant avec Runtime, un thread est un processus leger mais par contre si l'on decide de laisser le programme ouvert sa ne marche pas non plus.
Pour l'instant la seule chose que j'arrive a faire ce bloquer le thread principal avec join, cependant je ne trouve pas la façon de le reveiller a partir du thread fils.

Hors ligne

#12 Le 04/06/2008, à 09:09

Totor

Re : Java, et gerer les fermetures de programme

Effectivement, il est aussi possible que le fichier soit fermé sans fermeture du programme associé. Auquel cas, tu restes bloqué si tu cherches à savoir "qd le prg se ferme".

inotify ne t'informe pas de la fermeture du programme mais de la fermeture du fichier par un événement. Mais tu peux appliquer une règle radicale : lorsque le fichier est fermé alors je tente de fermer le programme l'ayant ouvert (puisqu'il se peut que le programme ait été fermé en même temps que le fichier).
Mais attention, il se peut aussi que le programme soit déjà ouvert avant l'ouverture de ton fichier où qu'un autre fichier ait été ouvert avec l'instance qui a ouvert ton fichier alors que ton fichier était ouvert.... c'est pourquoi cette règle est radicale !

pour les détails java, comme indiqué dans mon précédant post, je peux pas t'aider.

Mais bon, à toi de savoir ce qui répond à ton besoin :
- fermeture du fichier ?
- ou fermeture du programme ?

Dernière modification par Totor (Le 04/06/2008, à 09:13)


-- Lucid Lynx --

Hors ligne

#13 Le 04/06/2008, à 09:47

psyrio

Re : Java, et gerer les fermetures de programme

pour moi sa serait la fermeture du programme car je t'explique nous codons un file manager suportant le protocole FISH, et la fonction qu'il nous reste est l'edition distante , donc nous avons trouver comme solution de rapatrier le fichier distant que l'utilisateur a voulu ouvrir et ou l'ouvre avec le methode Open de la classe Desktop.
A la fin des modifications du fichier l'utilisateur ferme le programme et l'on doit renvoyer ce fichier dans le distant. voila l'enoncer du probleme complet.
smile

Hors ligne

#14 Le 04/06/2008, à 10:05

Totor

Re : Java, et gerer les fermetures de programme

Et bien justement, ce qui importe le plus est "le fichier". Si l'utilisateur ferme le fichier sans fermer le programme, le fichier ne sera pas renvoyé, alors que si tu détectes la fermeture du fichier, et surtout son enregistrement, alors tu le renvoies. Que ton programme reste ou non ouvert, c'est pas ton pb puisque tu gères des fichiers.


-- Lucid Lynx --

Hors ligne

#15 Le 04/06/2008, à 10:18

psyrio

Re : Java, et gerer les fermetures de programme

alors comment je pourrai faire puiisque j'utilise la methode open de la classe Desktop, ya t-il un moyen de detecter la fermeture du fichier??

Hors ligne

#16 Le 04/06/2008, à 10:36

Totor

Re : Java, et gerer les fermetures de programme

Totor a écrit :

...
inotify ne t'informe pas de la fermeture du programme mais de la fermeture du fichier par un événement.
...

Je suppose qu'en Java, on peut s'interfacer avec des API réalisées en C/C++ ?
Donc, avec (ou, si elles existent, avec les classes java équivalentes), tu mets une option sur le fichier à ouvrir (cf. doc) avant de l'ouvrir avec ta méthode "Open".

Ensuite, tu catch l'événement de fermeture/enregistrement émis par inotify. Et tu peux le retransférer.


-- Lucid Lynx --

Hors ligne

#17 Le 04/06/2008, à 14:25

psyrio

Re : Java, et gerer les fermetures de programme

si tu parle de Aplication c/c++, je ne sais pas du tout, mais par contre je ne vois pas du tout comment mettre une option sur un fichier,et si en java c possible ou pas.avce la  classe File je n'est pas trouver de methode correspondante

Hors ligne

#18 Le 04/06/2008, à 15:20

Totor

Re : Java, et gerer les fermetures de programme

mettre une option = surveiller son état (ouvert, écrit, fermé...)
ce que permet inotify !
Pour le Java... je peux pas te dire !
Je pense simplement que tu dois pouvoir utiliser l'API d' inotify en Java ...


-- Lucid Lynx --

Hors ligne