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

SWT/JFace Java Discussion :

Progress monitor et bouton cancel


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 12
    Par défaut Progress monitor et bouton cancel
    Salut,

    J'ai implémenté une classe qui etend IRunnableWithProgress.
    Mon code est du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
     
        Process process = Runtime.getRuntime.exec("configure.sh");
        process.waitfor();
     
        Process process2 = Runtime.getRuntime().exec("install.sh");
        process2.waitfor();
    }
    Le probleme c'est que chaque process que j'execute dure environ 20 min. Comment je peu interrompre les process par le bouton cancel du progressMonitor ? Si je fait monitor.isCanceled(), je peu le faire que entre les process ce qui est un peu embetant puisqu'on est obligé d'attendre 20 min entre chaque traitement.

    En gros je voudrai une fonction qui se reveille toute les 30 seconde et qui regarde si le monitor est cancel ...

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Puisque tu ne peux pas verifier a intervalles regulier dans ton traitement, tu vas devoir lancer 2 Threads :
    - la premiere qui fait ton traitement comme actuellement.
    - la seconde qui verifie l'etat isCanceled() du ProgressMonitor a intervalles reguliers et qui interrompt la premiere si besoin.

    Reste a voir ce que donne l'interruption des Processes...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 145
    Par défaut
    J'avais le même problème mais avec des appels à des librairies C++

    En les exécutant via le Runtime, cela ne permet pas d'arrêter proprement les process. Le kill est à déconseiller car c'est largement instable.

    La solution a été de passer par JNI. Ainsi je peux faire appel à mes librairies C++ dans mon code Java. Et encore mieux : les librairies peuvent appeler du code java (en l'occurrence l'incrément du monitor et l'annulation du proccess). Du coup, lors d'une annulation, la librairie sort proprement de son code, avec le bonus d'avoir le réel avancement du traitement dans le monitor.

    Ton problème c'est que, apparemment, tu veuille exécuter des scripts sh... et là je ne vois pas comment faire...

  4. #4
    Membre éprouvé
    Inscrit en
    Septembre 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 147
    Par défaut
    la meilleur solution c'est peux être de découper tes scripts sh en plusieurs scripts.
    pour que ca dure 20min, il y a certainement des boucles dans ton script. effectue cette boucle dans ton .java en passant les paramêtres qu'il te faut à tes nouveaux scripts et teste à interval régulier.

    Sinon, ce que tu peux faire c'est parser tes .sh en java et exécuter les instructions unes par unes en testant si c'est annulé.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 12
    Par défaut
    Bon ben je me repond à moi même.
    J'ai une fonction peut être pas très propre mais voila :

    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
     
    /**
             * Wait the process to be finished and allow user to cancel
             * job and kill the process
             * 
             * @param process       the process curently running
             * @param monitor       the monitor we want to show the process progression
             * @return      the exit value of the process
             * @throws InterruptedException
             */
    	private int processWaitForCancelable(Process process, IProgressMonitor monitor) throws InterruptedException {
    		boolean finish = false;
    		int exitValue = -1;
    		int i = 0 ;
     
    		int halfMinute = 0;
    		while (!finish) {
    			finish = true;
    			if (monitor.isCanceled()) {
    				process.destroy();
    				throw new InterruptedException("Canceled");
    			}
    			try {
    				exitValue = process.exitValue();
    			} catch (IllegalThreadStateException e) {
    				try {
    					Thread.sleep(250);
    					if (i++ % 120 == 0) {
    						if (halfMinute < 90) {
    							halfMinute ++;
    							monitor.worked(1);
    						}
    					}
    				} catch (InterruptedException e1) {
     
    				}
    				finish = false;
    			}
    		}
     
    		return exitValue;
    	}
    Cette fonction renvoie l'etat de sortie du processus process.
    Elle fait avancer le progress monitor d'un cran toutes les 30 seconde.
    Elle permet un cancel à n'importe quel moment du processus et kill celui-ci lors du cancel.


  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 12
    Par défaut
    Puisque tu ne peux pas verifier a intervalles regulier dans ton traitement, tu vas devoir lancer 2 Threads :
    - la premiere qui fait ton traitement comme actuellement.
    - la seconde qui verifie l'etat isCanceled() du ProgressMonitor a intervalles reguliers et qui interrompt la premiere si besoin.

    Reste a voir ce que donne l'interruption des Processes...
    Le probleme c'est que j'arrive pas à acceder à mon ProgressMonitor dans le deuxième thread. I doit i avoir surement une solution mais bon.... ... pas trouvé

    Jense -> je note mais je doit compiler et installer une librairie C++ donc je fait pas (encore) appel à elle.

    la meilleur solution c'est peux être de découper tes scripts sh en plusieurs scripts.
    pour que ca dure 20min, il y a certainement des boucles dans ton script. effectue cette boucle dans ton .java en passant les paramêtres qu'il te faut à tes nouveaux scripts et teste à interval régulier.

    Sinon, ce que tu peux faire c'est parser tes .sh en java et exécuter les instructions unes par unes en testant si c'est annulé.
    En fait c'est la compilation qui dure 20 min (au moins). Mon appli patch et recompile gcc donc lorsque je lance la commande make, c'est parti pour un bon petit moment et pas moyen de découper le script.

    Reste a voir ce que donne l'interruption des Processes...
    En les exécutant via le Runtime, cela ne permet pas d'arrêter proprement les process. Le kill est à déconseiller car c'est largement instable.
    PUT*** DE M**** .... La gestion des process en Java elle est vraiment pas fameuse... Pour killer un process c'est la croix et la banniere, on dirai que ca tue le pere et pas les fils !!!!!!?????? enfin bon ....

    MERCI A TOUS !!!!

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

Discussions similaires

  1. bouton cancel en asp.net
    Par alicia26 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 30/05/2007, 12h59
  2. Utiliser un bouton Cancel
    Par mimic50 dans le forum MFC
    Réponses: 3
    Dernier message: 31/08/2006, 22h33
  3. Boutons "Cancel" et "Continue"
    Par Romain93 dans le forum JSF
    Réponses: 2
    Dernier message: 25/07/2006, 14h45
  4. bouton cancel frame
    Par lazzeroni dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 16/05/2006, 08h41
  5. [JFrame] Boite de dialogue d'entrée de texte et bouton Cancel
    Par tooney dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 29/05/2005, 16h42

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