2010-07-15 14 views
1

J'ajoutais une fonctionnalité de barre de chargement à mon programme en Java et je me demandais si je pouvais définir une liste de processus à effectuer, afin de connaître le nombre de processus à effectuer. Par exemple, en les enregistrant sous forme de chaînes?Mettre des appels de méthode dans une ArrayList?

ArrayList<String> processes = new ArrayList<String>(); 
processes.add("CSVWriter.createFileOfCompany(\"Random Company\");"); 
processes.add("FileConverter.convertCSVToXLS(classPath + 
    \"/Output/Random_Company.csv\");"); 

for (int i = 0; i < processes.size(); i++) { 
    // run process 
    // update loading bar 
} 

Ce ne sont pas de vraies méthodes pour mon programme, mais elles sont assez similaires à ce que je veux accomplir.

Je suis sûr que ce n'est pas le meilleur moyen, mais je veux avoir un moyen de créer une liste comme ça, donc je sais combien de processus il y a avant de les exécuter. J'ai un système mis en place pour décomposer ces processus encore plus loin et montrer leurs progrès, donc cette barre est assez précise pour l'instant, mais je dois numéroter chacun des processus = /. Peut-être que je manque juste le point. Créer des barres de progression est totalement nouveau pour moi.

S'il existe de bons articles sur la création de la barre de progression, n'hésitez pas à m'en faire part également. Gardez à l'esprit que je n'utilise pas une interface utilisateur graphique basée sur le swing. Cette barre est tout le texte S.O.P.

Un grand merci,

Justian Meyer

+0

Est-ce que vous supposez que toutes vos méthodes vont prendre autant de temps à fonctionner? –

+0

Je ne m'attends pas à eux. Je veux fondamentalement décomposer les méthodes en blocs égaux. S'il y a 5 appels, il sera divisé en 5 blocs. Chacun de ces blocs recevra des informations des boucles dans les méthodes pour les remplir lentement. Imaginez-le comme ceci '[///// | ///// | ///// | ///// | /////] '...................................' [///// | ///// | // ... | ..... | .....] 'signifie que les deux premiers processus sont terminés et que 2/5 du processus 3 est terminé. Bien sûr, cela ressemblerait plus à: '[//////////// .............] 48%' –

+0

Ma méthode pour créer ceci n'est pas vraiment propre comme je voudrais, donc je suis totalement ouvert à de meilleures idées. –

Répondre

5

Closures sera, espérons bientôt dans la prochaine version de Java, mais en attendant vous pouvez utiliser des classes anonymes mettant en œuvre une interface connue:

List<Runnable> jobs = new ArrayList<Runnable>(); 

jobs.add(new Runnable() { 
    public void run() { 
     CSVWriter.createFileOfCompany("Random Company"); 
    } 
}); 

jobs.add(new Runnable() { 
    public void run() { 
     FileConverter.convertCSVToXLS(classPath + "/Output/Random_Company.csv"); 
    } 
}); 

for (Runnable job : jobs) { 
    job.run(); 
} 
+0

Pourquoi ne pas simplement utiliser Runnable ou Callable (si vous devez être capable de lancer une exception) au lieu de créer votre propre interface 'Job'. –

+1

Peter, je vous ai battu :-) – sanity

+0

Merci pour le montage, @Sanity. J'étais au milieu de moi-même. J'ai décidé d'utiliser une interface personnalisée à l'origine pour mieux illustrer l'idée, mais cela ne faisait qu'ajouter du bruit. – Gunslinger47

2

Voici un schéma qui me vient à l'esprit:

interface WorkProcess 
    void setWorkUnits(int units) 
    void setArguments(Object obj1,...) 
    void execute() 

Donc vous encapsulez toutes vos tâches avec une interface qui fait execute selon le modèle de commande classique; il est également dit (voir ci-dessous) combien de travail ce travail prendra probablement. Vous aurez probablement besoin d'un mécanisme pour transmettre des données dans ces tâches. Lorsque vous avez un travail à faire, vous demandez à l'usine de produire l'un de ces processus pour vous. Ce faisant, il fait l'estimation sur les unités de travail et transmet cela au WorkProcess qu'il vient de créer. Il conserve également un total de ces unités pour la mise en place du haut de l'indicateur de progression. Un effet secondaire cool de ceci est que vous n'avez pas besoin d'attendre que tous vos travaux soient préparés: Vous pouvez incrémenter la valeur maximale de votre rapport d'avancement chaque fois que vous ajoutez un travail alors que les travaux sont en cours de traitement et nouvellement créés; votre barre montrera toujours un rapport réaliste.

Vous pouvez insérer vos workflows dans une file d'attente quelconque. ExecutorService vient à l'esprit si votre WorkProcess implémente également l'interface Runnable (ce qui est une bonne idée). Vous serez libre de traiter ces tâches séquentiellement en un seul fichier ou en même temps, quelle que soit la structure de votre file d'attente d'exécution.

La méthode WorkProcess' execute() enveloppe essentiellement la méthode run() (ou peut-être l'inverse, puisque ExecutorService prévoit une méthode run() mais notre unité de travail magique est en execute()); mais quand cela est fait, il rappelle consciencieusement le reportWorkDone avec le nombre d'unités que son travail valait. Lors de la réception de ces rapports, l'usine dispose d'une valeur mise à jour pour les unités de travail effectuées, qu'elle peut renvoyer à ProgressListener. Cela, à son tour, met à jour la barre dans l'interface graphique.

Terminé. (Je pense). Probablement besoin d'un peu d'affinage.