theFrogkiller
Messages postés5Date d'inscriptionlundi 11 août 2008StatutMembreDernière intervention15 août 2008
-
11 août 2008 à 13:25
theFrogkiller
Messages postés5Date d'inscriptionlundi 11 août 2008StatutMembreDernière intervention15 août 2008
-
15 août 2008 à 14:09
bonjour,
voilà je développe une application autour de lancements de dés. une
partie consiste en l'affichage progressif du résultat de lancement de
dés. pour éviter de bloquer l'application à cause de l'EDT lors des
affichages successifs j'utilise la classe SwingWorker.
Et là c'est le drame !
mon appli a un comportement assez étrange. quand le nombres de dés est
grand tout ce déroule comme prévu. mais dès que le nombre de dés est
faible l'affichage se bloque et le nombres de cycles d'affichages est
aléatoire (de 10 à une centaine).
Si quelqu'un à une idée je suis preneur.
voici mes classes:
la classe Stat contient entre autre un tableau stockant les données du graphique.
le main:
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
publicclass TestThread {
/**
* @param args
*/
publicstaticvoid main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
publicvoid run(){
/** Démarrage de l'interface graphique et du SwingWorker. **/
FrameTest frame = new FrameTest();
}
});
}
}
la classe pour la frame:
<!-- BEGIN TEMPLATE: bbcode_code -->
@Override
protectedvoid process(List<Stat> stats){
/** Mise à jour du JPanel de dessin **/
System.out.println("processe n° : " + processe + " nb param dans process : " + stats.size());
Stat stat = stats.get(0);
stat.calculValMax();
frame.getJDessin().redessiner(stats.get(0), Color.RED);
processe++;
}
<!-- END TEMPLATE: bbcode_code -->toutes vos remarques sont les bienvenues car là je sèche, l'appli réagissant à l'opposé de ce que l'on pourrait croire.
Tueur de grenouille professionel en freelance
theFrogkiller
Messages postés5Date d'inscriptionlundi 11 août 2008StatutMembreDernière intervention15 août 2008 12 août 2008 à 19:17
Comme demandé voici les classes manquantes
la classe CalculsProgressifsUtils :
public class CalculsProgressifsUtils {
private static CalculsProgressifsUtils calculsProgressifsUtils = new CalculsProgressifsUtils();
public static CalculsProgressifsUtils getCalculsProgressifsUtils(){
return calculsProgressifsUtils;
}
public Stat tirageAleatoire(Stat stat, Collection<Des>cDes){
int result = 0;
int sizeTab = 0;
Iterator<Des> iDes = cDes.iterator();
while(iDes.hasNext()){
Des de = iDes.next();
sizeTab += de.getNbDes() * de.getNbFaces();
for(int i = 0; i < de.getNbDes(); i++){
result += (int)(de.getNbFaces() * Math.random()) + 1;
}
}
public Stat boucleTirageAleatoire(Stat stat, Collection<Des>cDes, int nbBoucles){
for(int i = 0; i < nbBoucles; i++)
stat = tirageAleatoire(stat, cDes);
return stat;
}
}
la classe Des :
public class Des implements Comparable<Des>{
private int nbFaces;
private int nbDes;
/** constructeurs **/
public Des(int nbDes, int nbFaces) {
this.nbDes = nbDes;
this.nbFaces = nbFaces;
}
public Des(){}
/** getters et setters **/
public int getNbFaces() {
return nbFaces;
}
public void setNbFaces(int nbFaces) {
this.nbFaces = nbFaces;
}
public int getNbDes() {
return nbDes;
}
public void setNbDes(int nbDes) {
this.nbDes = nbDes;
}
@Override
public String toString() {
String s = nbDes + " dé";
if(nbDes > 1){
s += "s";
}
s += nbFaces;
return s;
}
public void addDes(int nbDes) {
this.nbDes += nbDes;
la classe Stat :
public class Stat {
private int nbDifferent;
private double nbCas;
private double moyenne;
private double sigmaCarre;
private double valMax;
private double[] loiProba;
public double getNbCas() {
return nbCas;
}
public void setNbCas(double nbCas) {
this.nbCas = nbCas;
}
public int getNbDifferent() {
return nbDifferent;
}
public void setNbDifferent(int nbDifferent) {
this.nbDifferent = nbDifferent;
}
public double getMoyenne() {
return moyenne;
}
public void setMoyenne(double moyenne) {
this.moyenne = moyenne;
}
public double getSigmaCarre() {
return sigmaCarre;
}
public void setSigmaCarre(double sigma) {
this.sigmaCarre = sigma;
}
public double getValMax() {
return valMax;
}
public void setValMax(double valMax) {
this.valMax = valMax;
}
public double[] getLoiProba() {
return loiProba;
}
public void setLoiProba(double[] loiProba) {
this.loiProba = loiProba;
}
theFrogkiller
Messages postés5Date d'inscriptionlundi 11 août 2008StatutMembreDernière intervention15 août 2008 15 août 2008 à 01:45
effectivement c'est le fonctionnement attendu là ça bloque pour les paramètres suivants:
1- paramètres de bouclages et de sleep du thread dans l'interface:
public static int DEFAULT_LOOP_WAIT = 50;
public static int DEFAULT_LOOP_NUMBER = 1000;
2- valeur du dé dans la frame de test:
cDes.add(new Des(3, 6));
il faut moins de 6 dés à 6 faces pour que les cycles se bloquent.
theFrogkiller
Messages postés5Date d'inscriptionlundi 11 août 2008StatutMembreDernière intervention15 août 2008 15 août 2008 à 14:09
effectivement j'ai pus mettre la main sur le problème qui proviens bien de l'algorithme.
cela viens d'une bette erreur d'indexoutbound de la méthode tirageAleatoire. lors d'un tirage aléatoire j'incrémente le tableau contenant les valeurs de la loi de probabilité.
je faisais : stat.getLoiProba()[result] = stat.getLoiProba()[result] + 1t] au lieux de loiProga[resultat]
au lieu de : stat.getLoiProba()[result - 1] = stat.getLoiProba()[result - 1] + 1
dans un seul cas cela entraine une erreur. c'est lorsque l'on obtien la valeur maximale. evidement c'est l'évènement, avec le tirage de la plus petite valeur possible, qui a la plus faible probabilité expliquant ainsi pourquoi plus j'augmente le nombre de dés moins la boucle de raffraichissement se bloque. rien qu'avec 6 dés on a une probabilité qui tombe à 1/7776
enfin la raison principale pour ne pas avoir vus cela c'est que la méthode de tirage aléatoire est appellée dans la méthode ThreadSwingWorker.doInBackground() hors il fallait catché le Thread.sleep(500) par une InterruptedException du coup je n'ai pas vu l'IndexOutBoundException
pour avoir pris le temps de chercher mon erreur je me devais de fournir l'explication. Encore merci
Conclusion: il faut toujours tester unitairement ses méthodes!!!!