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

Concurrence et multi-thread Java Discussion :

[Thread] Problème de vitesse


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut [Thread] Problème de vitesse



    Je développe actuellement une IHM java dans laquelle les boutons de mon menu se déplacent pour faire apparaître les sous menus. J'utilise des threads pour effectuer ces déplacements. Tout marche parfaitement mis à part le fait que certaines fois, ce déplacement s'effectue plus vite que d'autres fois...

    A quoi est-ce dû et comment faire pour exécuter les threads dans un temps constant ?

    Voici une partie de mon code (déplacement des boutons vers la droite) :

    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
     
    ...
     
    public void run(){
     
    boolean condition = true;
     
    	while(condition == true){
     
    		stats.setBounds(stats.getBounds().x + 1, stats.getBounds().y, 125, 30);
    		graphiques.setBounds(stats.getBounds().x, graphiques.getBounds().y, 125, 30);
    		transactions.setBounds(stats.getBounds().x, transactions.getBounds().y, 125, 30);
    		odds.setBounds(stats.getBounds().x, odds.getBounds().y, 125, 30);
    		options.setBounds(stats.getBounds().x, options.getBounds().y, 125, 30);
    		quitter.setBounds(stats.getBounds().x, quitter.getBounds().y, 125, 30);
     
    	try {Thread.sleep(10);} catch (InterruptedException e) {}
     
    	            if(stats.getBounds().x >= 60)
    			condition = false;
     
    		}
     
     
     
    }
     
    ...
    Toutes les 10 millisecondes, mes boutons se déplacent de 1px vers la droite, sauf certaines fois où cela s'effectue de manière plus rapide...


    Je ne comprend pas pourquoi, et vous ?

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    C'est normal, l'allocation de ressource à un processus ne dépends pas de Java mais du système sous-jacent. Pour améliorer la répartition du temps processeur, il faut que tu appelles Thread.yield() à chaque itération. Cette méthode laisse la chance à thread concurrent de s'exécuter.

  3. #3
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Merci pour ta réponse.

    J'ai testé Thread.yield() ça a l'air d'arranger un peu les choses mais le résultat n'est pas parfait...


    Quant tu parles "d'améliorer la répartition du temps processeur", cela sous entend que l'on ne pourra jamais avoir une exécution constante en terme de temps ?

    Il n'existe aucune solution pour pallier ce genre de problème ?

    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par Madfrix
    Merci pour ta réponse.

    J'ai testé Thread.yield() ça a l'air d'arranger un peu les choses mais le résultat n'est pas parfait...


    Quant tu parles "d'améliorer la répartition du temps processeur", cela sous entend que l'on ne pourra jamais avoir une exécution constante en terme de temps ?

    Il n'existe aucune solution pour pallier ce genre de problème ?

    Merci
    Non, en effet, tu ne pourras jamais répartir le temps processeur de manière parfaitement égale. Ce que tu peux faire pour améliorer la situation est de repérer les portions chronophage et les décomposer en appelant Thread.yield à plusieurs endroit, voire même après chaque instruction. Ca ralentira ton application mais en contre-partie, l'exécution devrait être plus fluide.

    Mais au fait, je ne comprends pas bien, il y a combien de thread à s'exécuter en même temps ?

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Tu prends le problème à l'envers : il ne faut pas exécuter un déplacement constant avec un délai fixe (dans ton cas 10ms) (car le délai n'est en réalité pas fixe), mais il faut exécuter un déplacement dont la distance dépend du délai écoulé.
    Donc tu "demandes" à l'exécuter toutes les 10ms (avec javax.swing.Timer, ça sera plus propre que thread avec des sleep), et tu calcules combien de temps s'est écoulé depuis le début (ou depuis la dernière mise à jour, ça dépend de ton problème).

    Par exemple si tu veux que ton objet se déplace de 100px / seconde, tu récupères le temps écoulé depuis le début (en faisant une différence de System.nanoTime()), puis tu calcules:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long tempsEcoule = System.nanoTime() - nanoTimeStart;
    int px = (int) (tempsEcoule*1e-7);

  6. #6
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour,

    je pense que je vais m'orienter vers ta solution ®om. En effet, je n'arrive pas à effectuer des déplacements "stables" dans le temps ce qui est vraiment gênant. Avec ta méthode, je vais sans doute résoudre mon problème.

    Un grand merci en tout cas !

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

Discussions similaires

  1. Thread problème pour l'arreter
    Par rvzip64 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2005, 10h51
  2. [Thread]Problème de processus
    Par berg dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2005, 20h40
  3. Thread--> problème avec ThreadProc
    Par stof dans le forum MFC
    Réponses: 33
    Dernier message: 08/06/2005, 13h47
  4. [debutant][c++] Problème de vitesse de déplacement
    Par bornibus dans le forum OpenGL
    Réponses: 15
    Dernier message: 26/02/2005, 09h16
  5. [OpenGL] Problème de Vitesse d'éxécution
    Par stick059 dans le forum OpenGL
    Réponses: 9
    Dernier message: 19/11/2004, 13h57

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