2017-08-15 6 views
0

Je cours un outil qui exécute un programme Java externe plusieurs fois dans son fonctionnement. L'outil externe commence par l'ouverture d'un JOptionPane dans un JFrame.Le programme rejette les étapes lors de l'exécution rapide (Java)

Voici un script de test que j'ai écrit pour essayer de résoudre mon problème.

import java.io.File; 

public class Test { 
    public static void main(String[] args) throws Exception { 

     for(int i=0; i<6; i++) { 
      //Thread.sleep(1000); 

      String toRun = "java -jar \"" + "C:\\Folder\\File.jar" + "\" " + i; 

      Runtime.getRuntime().exec(toRun, null, new File("C:\\Folder")); 
     } 
    } 
} 

Lorsque cela fonctionne, seulement JOptionPane (i = 5) de la course finale apparaît, mais il semble que d'autres « essaient » d'apparaître comme des vitres semblent ouvrir et fermer immédiatement.

Lorsque je décommente le Thread.sleep cependant, tous les volets s'ouvrent séparément. Si je règle le sommeil à 300 (0,3 secondes), environ la moitié des volets apparaissent, généralement le premier et le dernier.

Je voudrais trouver un moyen d'exécuter toutes les instances du programme externe complètement sans avoir besoin d'utiliser Thread.sleep() du tout, si possible.

Modifier: Conformément à mes exigences, j'ai également minimisé mon programme externe.

import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class File { 
    static JFrame frame = new JFrame("Frame"); 
    private static String doc1Address = "C:\\Folder\\doc1.csv"; 
    private static String doc2Address = "C:\\Folder\\doc2.csv"; 


    public static void main(String[] args) throws Exception { 
     if(args.length == 1) { 

      SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss"); 
      Date date = new Date(); 
      String currentDate = form.format(date); 

      //Save Backup of doc1 
      String doc1BackAddress = doc1Log.substring(0, doc1Log.length()-15) + "doc1Back " + currentDate + ".csv"; 
      Path todoc1 = Paths.get(doc1Address); 
      Path todoc1Back = Paths.get(doc1BackAddress); 
      Files.copy(todoc1, todoc1Back); 
      Files.setAttribute(todoc1Back, "dos:readonly", true); 

      //Save Backup of doc2 
      String doc2BackAddress = doc2Log.substring(0, doc2Log.length()-16) + "doc2Back " + currentDate + ".csv"; 
      Path todoc2 = Paths.get(doc2Address); 
      Path todoc2Back = Paths.get(doc2BackAddress); 
      Files.copy(todoc2, todoc2Back); 
      Files.setAttribute(todoc2Back, "dos:readonly", true); 

      //Format JFrame 
      frame.pack(); 
      frame.setLodoc1ionRelativeTo(null); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

      JOptionPane.showMessageDialog(frame, args[0]); 
      frame.dispose(); 
     } 
    } 
} 
+0

Sont-ils censés fonctionner en parallèle ou l'un après l'autre? – RealSkeptic

+0

En parallèle. Lorsque la fonction de veille est incluse, les 6 volets apparaissent l'un après l'autre en succession rapide, de sorte que tous les 6 sont sur l'écran à la fois, et les fonctions suivantes de ce programme fonctionnent en parallèle. – Dant

+0

Qu'y a-t-il de mal à les faire fonctionner l'un après l'autre? – notyou

Répondre

0

J'ai trouvé mon propre problème; car les fichiers de sauvegarde utilisent le format yyyy-MM-dd hh-mm-ss et les fichiers enregistrés au cours de la même seconde entraînent une exception FileAlreadyExists, ce qui signifie que seul le premier fichier à terminer l'enregistrement permet au programme de continuer à s'exécuter. Après une pause d'une seconde, les fichiers ont des noms de sauvegarde différents, donc aucune erreur ne se produit. Une pause de moins d'une seconde entraîne un certain chevauchement de noms de fichiers, mais aussi des noms différents, d'où l'apparition de certains fichiers. Solution: modifiez le format du nom (c'est-à-dire incluez les millisecondes) ou incluez les fonctions de sauvegarde dans une instruction if, ignorée si le fichier ayant la même heure existe déjà. (Aussi, merci @ErwinBolwidt, étant encouragé à formater ma question correctement, j'ai réalisé que le problème dans mon code n'était pas là où je l'avais supposé être).