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

AWT/Swing Java Discussion :

[debutant]Thread animation et synchronisation


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut [debutant]Thread animation et synchronisation
    bonjour bonsoir,

    J'ai un programme qui permet de faire deplacer un objet sur un panel, jusque la pas de probleme, j'ecris dans une sorte de console les commande a executer et l'objet se deplace

    par exemple pour avancer de 50 je vais ecris "av 50" et ca va faire appel a ma fonction avance(), de meme pour reculer je vais faire "re 50" et ca va faire appelle a ma fonction recule(), pour tourner l'objet de 90 degré sur la droite je vais ecris "dr 90".

    Mais j'ai voulu animé le deplacement, jsuque la l'objet allais directement a la place qu'on lui donnait. J'ai donc utilisé des Thread car moi on ma appris, animation -> Thread (c ptete pas juste d'ailleur)

    Ma classe contenant ces fonction est devenu implement runnable (elle extend Jpanel) et ma fonction avance et reculer devient quelque chose comme ca (en simplifié) :
    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
     
    private int modifier;
    prvate boolean avance, recule;
    public synchronized void Avance(int modif) {
    t = new Thread(this);	
    modifier = modif;
    avance=true;
    t.start();
    avance=false;
    }
     
    public synchronized void Avance(int modif) {
    t = new Thread(this);	
    modifier = modif;
    recule=true;
    t.start();
    recule=false;
    }
    puis le deplacement dans mon run (simplifié)
    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
     
    public void run() {
    //sens de deplacement, si sens = vrai alors on avance, sinon on recule
    boolean sens = true;
    if (avance) sens=true;
    else if (recule) sens=false;
     
    if (sens)
    for(int i = 1; i < modifier; i++)
    {
    objetadeplace.x += i;
    repaint();
    try {t.sleep(100);} 
    catch (InterruptedException e) {e.printStackTrace();}	
    }
    else for(int i = 1; i < modifier; i++)
    {
    objetadeplace.x -= i;
    repaint();
    try {t.sleep(100);} 
    catch (InterruptedException e) {e.printStackTrace();}	
    }
    }
    bon c'est pas tres propre jsuis d'accord mais bon c'est un peu du bidouillage, donc la qd je fait "av 50" je vois bien mon objet qui se deplace nikel, pareil qd je fait "re 50".
    mais si je fait une commande un peu plus complexe "repete 4 [av 50 dr 90]" (en gros ca devrait faire un carré) ben la c l'anarchie ca avance et ca tourne en meme tps, pareil si je fait du recule/avance a la suite.

    Moi tout ce que je voudrais c qu'une fois que mon thread qui fait avancer est terminé je puisse passer a l'execution des auutre commande, bloquer ma fonction avance tant que avance ne s'est pas terminer.

    Alors je me suis renseigné du coté de join(), et j'ai fait un t.join() apres mon start() mais ca ne change de rien, j'ai lu sur le net qu'on pouvais faire un while(!t.isAlive() {} ben c'est pire, donc si ya une solution miracle ou tout simplement une solution je vous ecoute ^^

    Euh sinon comme pour moi mon programme n'avais pas forcement besoin de Thread me suis dit qu'on pouvait ptete faire ca autrement car moi dans le fond tout ce que je veux en gros c un sleep puis un repaint ds une boucle for
    mais si je met ca directement dans ma fonction avancer ou reculer ca attend la fin de la boucle puis ca repaint donc aucune animation, sinon je me suis orienté du coté d'un Timer mais j'ai pas vraiment reussi a en tirer quelque chose je suis pas sur que ca soit adapter a la situation.


    Bref je galere, et demande de l'aide. En espereant avoir été clair toute facon je reste dans le coin. ^^



    Merci d'avance a vous

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    Salut !!!

    C'est entièrement normal.

    En effet, tu n'utilise pas bien ton (ou plutot) tes thread.***Je supose que ta commande qui decrypte en une seule ligne 4 commande simultanément n'attend est super rapide. Voila techniquement se qui doit se passer :


    tu envoie ta commande :
    decryptage première info = avancer => start du thread, lancement du thread qui dure 10 seconde
    decryptage deuxième info des que du temps cpu est libéré (soit quelque micro seconde après le lancement du premier = reculer => start du thread, lancement du thread qui dure 10 seconde

    ...

    donc au final, tes threads tourne en parrallèle. Donc quant j'avance tu ... enfin on a compris.

    Ce qu'il t faut faire, car tu n'as en fait droit qu'a un seul et unique objet, on est d'accord, c'est d'avoir droit qu'a 1 seul et unique thread qui représente ton objet. Et pour lui faire succéder les commande, il te faut géré une pile.

    En fait ton premier programme marchait car les commandes étaient instanctané. Si tu taquine les threads, je supose que tu ne devrais pas avoir de problème pour faire ca, car dans ton cas c'etait une erreur de méthode !!

    @+

    Ps : sinon tu a le choix de faire des commandes bloquantes, sans thread, mais c'est super moche !!!
    Ps2 : tu as deux avance dans ton code
    Ps 3 : une astuce pour faire avance et recule, tourne a gauche et a droite ensemble est d'utiliser le signe +1 pour avancer et -1 pour reculer.
    Ainsi tu aurais une fonction : déplacer(int av_ar, int gau-droi)
    avec les valeur -1, 0, 1 sur chaque valeur et ainsi tu peut gérer vitesses sens et arrêt en une variable.

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    Je tiens a te remercier, javais pas vraiment penser a la pile

    J'ai donc creer un vecteur d'entier auquel j'ajoute ma valeur de deplacement (negatif si c pour reculer) et ds mon run je tourne tant que le vecteur n'est pas vide, si la pile devient vide alors le vecteur s'arrete, et donc ds mes fonction avance() et recule() si le vecteur est vide jajoute ma valeur et je relance le thread sinon je rajoute juste ma valeur au vecteur

    Merci bcp (du coup toutes mes fonctions de deplacement doivent etre changer ^^)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2007, 19h59
  2. [debutant]threads - variables partagées.
    Par nivose110 dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 18/01/2006, 06h34
  3. [Thread] Problème de synchronisation
    Par Pe04 dans le forum Concurrence et multi-thread
    Réponses: 12
    Dernier message: 13/12/2005, 11h44
  4. [débutant][Thread] wait et NotifyAll
    Par norkius dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 14/03/2005, 15h28
  5. [Débutant][Threads] Problème de synchronisation
    Par sephile dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 02/01/2005, 23h29

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