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

Interfaces Graphiques en Java Discussion :

Freeze complet de l'application


Sujet :

Interfaces Graphiques en Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Freeze complet de l'application
    Bonjour à tous,

    tout d'abord je me permet de préciser que j'ai déjà fait des recherches sur le sujet mais sans résultats et que mes compétences en Java tiennent de l'autodidactique.

    Voilà j'ai commencé un jeu comme plusieurs autres fois et cela marchait bien jusqu'à un moment où sans raison, à chaque fois que je lance, au bout d'un temps qui semble aléatoire l'application freeze complètement, plus aucun timer ne fonctionne. La fenêtre est encore la mais ne veux plus se fermer et le panel principal garde la dernière image. Eclipse me dit que l'application fonctionne encore et ne renvoie pas d'erreur.

    Voici le code sur GitHub : lien

    Comme vous le voyez, j'ai essayé de séparer deux threads celui du jeux et de l'affichage mais cela ne change rien.
    Je ne comprend pas d'où vient le probème, est-ce un problème de mémoire ?

    Merci d'avance de votre aide.

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    J'ai trouvé, cela ne venait pas d'un quelconque thread mais d'une boucle qui mine de rien se bloque au bout d'un moment.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'abord tes threads ils sont illusoires. Le fenetre ne fait que créer la fenetre et puis laisse au thread swing le soins de faire tout le dessin (ce qui est normal)
    Le Game ne fait que déléguer tout le travail au Thread swing via swing timer. Autrement dit tu fais faire au thread graphique de swing tout le travail de gérer ta logique de jeu. Ca va devenir problématique quand ta logique ne pourra plus se calculer en en quelques milli secondes.


    Revenons au problème. Dans ta bulle tu fais ça au niveau de l'update:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		if(ia){
    			do{
    				setVit(vit[0]+new Random().nextDouble()/2D-0.25D,
    						vit[1]+new Random().nextDouble()/2D-0.25D);
    			}while(Math.abs(vit[0])>FACTOR/p || Math.abs(vit[1])>FACTOR/p);
    		}
    L'idée, je suppose, c'est de faire un mouvement aléatoire, mais de ne l'autoriser que si la fin est dans les limites autorisées de mouvement. Regardons ce qui se passe quand ca tombe dehors, je vais regarder uniquement vit[0].

    prenons vit[0] = FACTOR/p au départ. C'est possible car un appel précédent a pu l'autoriser, c'est juste la dernière valeur limite possible.
    Tu ne peux plus que réduire vit[0], ce qui signigique qu'il te faut random/2-0.25 <=0.0, donc random < 0.5

    Si random > 0.5, alors le new vit[0] sera inaceptable et supérieur à la limite, mais tu le stocke quand même via setVit().

    imaginons random =0.8 comme exemple: vit[0]=FACTOR/p+0.8/2-0.25=FACTOR/p+0.15

    On refait alors une boucle. Mais maintenant il faut que random/2-0.25 < -0.15, donc il te faut random < 0.2

    imaginons random =0.9 parce que pas de bol quoi: vit[0]=FACTOR/p+0.15+0.9/2-0.25=FACTOR/p+0.35

    On refait alors une boucle. Mais maintenant il faut que random/2-0.25 < -0.35, donc il te faut random < -0.1
    C'est devenu impossible, il te faudra maintenant plusieurs valeurs favorables (random <0.5) pour ramener la valeur vers les bornes acceptables.

    Ton problème est tout simplement que tu stocke des valeurs inacceptables dans ta boucle et tu repars de là. Ton mouvement aléatoire t'a amené en dehors des limites et tu essaie de ramener cette valeur à l'intérieur avec une série de mouvement aléatoire. Mais il y a une probabilité non nulle que ce mouvement ne ramènera jamais la valeur à l'intérieur dans des temps raisonnables.


    Ton code peux être corrigé comme ça afin de toujours essayer un autre mouvement depuis la dernière bonne valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		if(ia){
    			double vit0;
    			double vit1;
    			do{
    				vit0 = vit[0]+new Random().nextDouble()/2D-0.25D;
    				vit1 = vit[1]+new Random().nextDouble()/2D-0.25D);
    			}while(Math.abs(vit0)>FACTOR/p || Math.abs(vit1)>FACTOR/p);
    			setVit(vit0,vit1);
    		}
    Bon, il reste une probabilité qu'il faille des caintaines milliers de boucles pour avoir une valeur acceptable, mais cette probabilité est infime et souvent acceptée. L'idéal serait de plutot calculter d'abord le range acceptable de valeur aléatoire et de tirer uniquement dans ce range

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci pour ces détails j'avais trouvé ce même problème. Cette partie avait été tapée rapidement puisque je comptais la changer complètement a posteriori. Cela ne semble pas logique de modifier la vitesse puis de la tester. Il faut d'abord tester la valeur qu'on souhaite lui appliquer puis la modifier.
    Mais par rapport au thread, si j'ai bien compris, ils sont ici inutiles pour accélérer le jeu. Que doit-je faire alors si je ne veux pas de ralentissement au centième de seconde ?

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu dois faire tourner tes calculs dans autre chose qu'un swing timer. Un java.util.Timer, par exemple. Attention du coup, puisque tu va modifier dans un Thread a afficher dans l'autre tu ve devoir commencer à synchroniser l'accès aux données pour gérer les accès concurrents.

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

Discussions similaires

  1. Manuel d'instalation complet d'une application j2ee
    Par mercafa dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 10/08/2008, 12h39
  2. Masquer completement l'application Excel
    Par fabien114 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/06/2008, 10h12
  3. j'ai besoin d'aide pour completer mon application
    Par sawssouna dans le forum Langage
    Réponses: 1
    Dernier message: 08/05/2007, 15h41
  4. Exemple complet d'application PHP ?
    Par schoendo dans le forum Livres
    Réponses: 5
    Dernier message: 19/02/2007, 18h12
  5. mon application ne se ferme pas completement
    Par smail21 dans le forum Bases de données
    Réponses: 6
    Dernier message: 13/09/2005, 15h15

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