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 :

Synchronisation de Thread - Executable lancé avec Runtime ne calcule pas jusqu’à la fin


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Synchronisation de Thread - Executable lancé avec Runtime ne calcule pas jusqu’à la fin
    Bonjour,
    Merci à ceux et celles qui m’aideront à résoudre le problème expliqué ci-dessous.
    L'exécutable en question fait les calculs une fois que tous les paramètres sont renseignés. Par étape, une question est posée sur une invite de commande dos et l'utilisateur doit renseigner les paramètres demandés. Quand tous les paramètres sont renseignés, l'exécutable calcule pendant 4 secondes et sort un fichier résultat. Le code en java que j’ai écrit jusqu’à maintenant ne permet pas que cet exécutable arrive à faire jusqu’à la fin le calcul qu’il doit faire, il s’arrête au milieu et ne remplit pas le fichier résultat comme il faut (au lieu de sortir un/des fichiers résultats de 23Ko, je n’ai que 1Ko).
    Voici comment j’ai procédé : L’objet est d’automatiser un calcul à partir d’un exécutable Fortran, sans interface graphique mais qui a besoin qu’on renseigne 8 groupes de paramètres. Pour passer d’un groupe de paramètre à un autre, il faut taper un « retour chariot ». Le premier et le dernier groupe de paramètres doivent être lus à partir d’un fichier texte « param.txt » avec plus de 200 lignes (ce qui explique le désir d’automatiser). L’executable est lancé par Runtime, le fichier « param.txt » est lu et j’utilise BufferReader puis StringTokenizer pour sélectionner le bon paramètre à renseigner sur le OutputStream du processus crée lors du lancement de l’executable. Pour synchroniser le tout, j’ai crée 9 Threads. Le premier lance l’exécutable avec Runtime et les 8 autres renseignent les groupes de paramètres (même méthode write de OutputStream, seuls les groupes de paramètres changent). En effet, il faut que les paramètres saisis sur l’OutputStream correspondent à ceux demandés par l’executable. Comme je lis le fichier paramètre «param.txt» ligne par ligne, j’ai mis un « break » dans le else du boulce if de lecture du fichier (voir code ci-dessous). Par conséquent, j’ai un java.lang.NullPointerException sur les 8 méthodes write.
    Apparemment, c’est le break qui pose problème ?! Ou est-ce la synchronisation qui est mal implémentée ? J’ai essayé d’interrompre les threads dans la partie else à la place du break mais sans succès.
    Voici une copie de mon main, si ça peut aider.
    Merci beaucoup.

    Code java : 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
    public static void main(String[] args) throws InterruptedException {
    		LancementPrgATaBGH p = new LancementPrgATaBGH();
    		MyProcess mypr = p.new MyProcess();
    		Thread runPano = p.new LanceProcess(mypr);
    		Thread writePano1 = p.new writeProcess1(mypr.lance());
    		Thread writePano2 = p.new writeProcess2(mypr.lance());
    		Thread writePano3 = p.new writeProcess3(mypr.lance());
    		Thread writePano4 = p.new writeProcess4(mypr.lance());
    		Thread writePano5 = p.new writeProcess5(mypr.lance());
    		Thread writePano6 = p.new writeProcess6(mypr.lance());
    		Thread writePano7 = p.new writeProcess7(mypr.lance());
    		Thread writePano8 = p.new writeProcess8(mypr.lance());
    		try {
    			BufferedReader br = new BufferedReader(new FileReader("param.txt"));
    			while (true) {
    				String ligneLue = br.readLine();
    				System.out.println(ligneLue);
    				if (ligneLue != null) {
    					Process pss = mypr.lance();
    					OutputStream os = pss.getOutputStream();
    					BufferedWriter wr = new BufferedWriter(
    							new OutputStreamWriter(os, "UTF8"));
    					StringTokenizer tok = new StringTokenizer(ligneLue, "	");// tabulation
    					mypr.write1(pss, wr, tok);
    					mypr.write2(pss, wr, tok);
    					mypr.write3(pss, wr, tok);
    					mypr.write4(pss, wr, tok);
    					mypr.write5(pss, wr, tok);
    					mypr.write6(pss, wr, tok);
    					mypr.write7(pss, wr, tok);
    					mypr.write8(pss, wr, tok);
    					os.flush();
    				} else
     
    				{
    					break;
    				}
    			}
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		runPano.start();
    		writePano1.start();
    		writePano2.start();
    		writePano3.start();
    		writePano4.start();
    		writePano5.start();
    		writePano6.start();
    		writePano7.start();
    		writePano8.start();
     
    	}

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Ou est-ce la synchronisation qui est mal implémentée ?
    Ha bon il y'a une synchronisation quelques parts ? On ne dirait pas au vu du code.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Ha bon il y'a une synchronisation quelques parts ? On ne dirait pas au vu du code.
    Merci pour la réponse,
    En fait j'ai crée une classe MyProcess dans laquelle j'ai mis les méthodes synchronisées :
    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
    public synchronized Process lance() throws InterruptedException {
    			if (!pret) {
    				Runtime r;
    				r = Runtime.getRuntime();
    				try {
    					proc = r.exec("PANO-PDP.exe");
    					notifyAll();
     
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			} else
    				wait();
    			return proc;
    		}
     
    		public synchronized void write1(Process proc, BufferedWriter wr,
    				StringTokenizer tok) throws InterruptedException {
    			if (!pret) {
    				try {
    					BufferedReader in = new BufferedReader(
    							new InputStreamReader(proc.getInputStream()));
    					String fluxDeQuestion = in.readLine();
    					System.out.println(fluxDeQuestion);
    					wr.write(tok.nextToken() + "\n");
    					wr.flush();
    					notifyAll();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			} else
    				wait();
    		}
    ensuite j'ai crée les classes extends Thread que j'appelle dans le main (en copie du premier mail) :
    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
    	class LanceProcess extends Thread {
    		public LanceProcess(MyProcess proc) {
    			this.proc = proc;
     
    		}
     
    		public void run() {
    			try {
    				while (!interrupted()) {
    					proc.lance();
    					sleep(50);
    				}
     
    			} catch (InterruptedException e) {
    			}
    		}
     
    		private MyProcess proc;
    	}
     
    	class writeProcess1 extends Thread {
    		MyProcess mypro = new MyProcess();
    		private BufferedWriter wr;
    		private StringTokenizer tok;
     
    		public writeProcess1(Process proc, BufferedWriter wr,
    				StringTokenizer tok) {
    			this.proc = proc;
    			this.wr = wr;
    			this.tok = tok;
    		}
    		public writeProcess1(Process proc) {
    			this.proc = proc;
    		}
    		public void run() {
    			try {
    				while (!interrupted()) {
    					mypro.write1(proc, wr, tok);
    					sleep(50);
    				}
     
    			} catch (InterruptedException e) {
    			}
    		}
     
    		private Process proc;
     
    		public Process getProc() {
    			return proc;
    		}
    	}

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Un truc que je trouve bizarre c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = r.exec("PANO-PDP.exe");
    Je n'ai pas l'impression que tu t'assures qu'il soit bien fini avant de continuer, est-ce normal ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Un truc que je trouve bizarre c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = r.exec("PANO-PDP.exe");
    Je n'ai pas l'impression que tu t'assures qu'il soit bien fini avant de continuer, est-ce normal ?
    l'executable, une fois lancé ne calcule pas de suite mais envoie des questions que je récupère avec InputStreamReader. Je dois répondre à ces questions (Il y en a 8 au total, d'où les 8 méthodes write sur le OutputStream). Ces réponses doivent être synchrone et à la suite. D'où l'ordre dans mon main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Thread runPano = p.new LanceProcess(mypr);
    		Thread writePano1 = p.new writeProcess1(mypr.lance());
    		Thread writePano2 = p.new writeProcess2(mypr.lance());
    		Thread writePano3 = p.new writeProcess3(mypr.lance());
    		Thread writePano4 = p.new writeProcess4(mypr.lance());
    		Thread writePano5 = p.new writeProcess5(mypr.lance());
    		Thread writePano6 = p.new writeProcess6(mypr.lance());
    		Thread writePano7 = p.new writeProcess7(mypr.lance());
    		Thread writePano8 = p.new writeProcess8(mypr.lance());
    et puis les méthodes write dans la boucle if de lecture du fichier paramètre :
    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
    if (ligneLue != null) {
    					Process pss = mypr.lance();
    					OutputStream os = pss.getOutputStream();
    					BufferedWriter wr = new BufferedWriter(
    							new OutputStreamWriter(os, "UTF8"));
    					StringTokenizer tok = new StringTokenizer(ligneLue, "	");// tabulation
    					mypr.write1(pss, wr, tok);
    					mypr.write2(pss, wr, tok);
    					mypr.write3(pss, wr, tok);
    					mypr.write4(pss, wr, tok);
    					mypr.write5(pss, wr, tok);
    					mypr.write6(pss, wr, tok);
    					mypr.write7(pss, wr, tok);
    					mypr.write8(pss, wr, tok);
    					os.flush();
    				} else
     
    				{
    					break;
    				}
    Et c'est à la sortie de cette boucle, sur le break qu'il y a le problème.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Un truc que je trouve bizarre c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc = r.exec("PANO-PDP.exe");
    Je n'ai pas l'impression que tu t'assures qu'il soit bien fini avant de continuer, est-ce normal ?
    Je ne veux pas que le processus finisse avant qu'il ait fini de calculer. C'est la raison pour laquelle je n'ai pas mis
    ou même .

    Quelqu'un saurait-il comment faire?

Discussions similaires

  1. Execution d'une commande avec Runtime
    Par Djobird dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 17/04/2009, 11h44
  2. [Runtime] executer .msi avec java
    Par molding dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 16/03/2009, 16h38
  3. Executer .accde avec le runtime
    Par azopei dans le forum Runtime
    Réponses: 3
    Dernier message: 12/01/2008, 12h40
  4. JAVA: arguments avec runtime ne marche pas
    Par aweqqas dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 28/08/2007, 19h17
  5. [Swing] execution avec Runtime.getRuntime().exec
    Par benssj5 dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2004, 14h54

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