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 :

[BIZARRE] problème de thread et condition IF


Sujet :

Concurrence et multi-thread Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut [BIZARRE] problème de thread et condition IF
    Bonjour à tous,

    Je publie aujourd'hui sur ce site car j'ai grand besoin de votre aide pour un problème plutôt bizarre.. Je m'explique:

    Dans le cadre de la création de mon programme de tchat, mon support de travail est une JFrame qui contient un JPanel qui contient un JButton. Je souhaite mettre à jour les dimensions cette la frame en appuyant sur le bouton. Pour éviter que la scrutation de l'appui sur le bouton par un écouteur exterieurs ne bloque le programme, j'ai choisi de passer un Thread donc voici la fonction "run()":
    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
     
    public void run() {
    		// TODO Auto-generated method stub
    		boolean threadFinished = false;
    		try {
    			while(!threadFinished){
    				if(this.panelConnection.connectionAsked){
    					this.setBounds(450, 50, 460, 650);
    					threadFinished = true;
    				}
    			}
    		} catch (Exception e) {
    			Server.msgWindowServer.setMsgWindowServer("ERREUR: Problème d'affichage + e");
    			System.err.println("Erreur affichage");
    		}
     
    }
    Mais un problème un peu bizarre intervient. Ce thread se lance correctement mais il ne parvient pas à passer la condition IF qui du coup bloque le déroulement de la fonction...
    J'ai donc lancé le programme en mode Debbug et quand je fais dérouler le programme pas à pas, le IF est passé correctement et la fenêtre se redimensionne comme je le veux.
    J'ai réalisé un second test avec des println(), et la aussi le programme fonctionne correctement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                            while(!threadFinished){
                                    System.out.println("attente...");
    				if(this.panelConnection.connectionAsked){
    					this.setBounds(450, 50, 460, 650);
    					threadFinished = true;
    				}
    			}
    on voit le code se lancer et le message "attente..." s'écrire indéfiniment jusqu’à l'appui sur le bouton. Puis la fenêtre se redimensionne.

    Mais quand je lance le programme normalement sans test.. ca ne fonctionne pas..

    C'est vraiment bizarre! est ce que quelqu'un aurait une explication s'il vous plait????



    PS: le passage par la variable "connectionAsked" plutôt que par un ActionListener peut paraître inadapté mais est nécessaire.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Bonjour,


    Le problème vient de l'absence totale de synchronisation, et du coup le changement de valeur n'est pas vu...
    L'ajout d'un System.out.println() force une synchro...

    Il faudrait déclarer "connectionAsked" en volatile...




    Mais on on est d'accord c'est très crade tout cela hein.




    Citation Envoyé par Sabubu Voir le message
    PS: le passage par la variable "connectionAsked" plutôt que par un ActionListener peut paraître inadapté mais est nécessaire.
    Et en quoi c'est nécessaire ?

    Parce qu'en plus de paraitre inadapté, ca va surtout bouffer un CPU à 100% pour ne rien faire !!!


    a++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    merci adiGuba, je vais essayé ce que tu m'a dis en déclarant en volatile la variable

    Mais je vois ce que tu veux dire pour la charge CPU, seulement quand ce thread est lancé, la tâche principale de tchat que je suis en train de faire n'est pas encore démarrer à ce stade donc c'est pas génant.

    Mais pour répondre à ta question je n'utilise pas d'ActionListener car dans la déclaration de ce dernier j'ai mis une condition pour tester la cohérence d'une valeur entrée dans une textArea. Et je souhaite que le redimensionnement de la fenêtre se fasse uniquement si la valeur est correct.

    Nom : ihm.png
Affichages : 104
Taille : 23,6 Ko

    avec l'actionListener, il m'applique le changement directement...
    (sachant que la fonction de test et de redimentionnement ne sont pas dans les même classes.. la variable me permettait d'en faire l'interface entre les deux)

    Je sais pas si je suis clair là???

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Il faudrait déclarer "connectionAsked" en volatile...
    Ah super ça marche maintenant, la fenêtre se redimentionne au bon moment, t'es balèze

    merci beaucoup!!

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sabubu Voir le message
    Mais je vois ce que tu veux dire pour la charge CPU, seulement quand ce thread est lancé, la tâche principale de tchat que je suis en train de faire n'est pas encore démarrer à ce stade donc c'est pas génant.
    Si c'est gênant !!!

    Tu fais un attente active : c'est à dire une boucle infini qui vérifie constamment la valeur d'une variable.
    Ca va faire tourner le CPU à fond pour rien !

    Tu peux le voir facilement si tu affiches la liste des process, ton process va prendre 100% du CPU (ou 50% ou 25%, etc. selon le nombre de core de ton CPU).




    Citation Envoyé par Sabubu Voir le message
    Mais pour répondre à ta question je n'utilise pas d'ActionListener car dans la déclaration de ce dernier j'ai mis une condition pour tester la cohérence d'une valeur entrée dans une textArea. Et je souhaite que le redimensionnement de la fenêtre se fasse uniquement si la valeur est correct.
    Et en quoi tu ne peux pas faire cela dans l'ActionListener ???
    Par exemple au moment où tu mets la variable "connectionAsked" à true...


    a++

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    ok ca marche je vais étudier ca pour faire des améliorations une fois que j'aurais fait une première version du soft, mais clairement je vais éviter de prendre tout le CPU juste pour ca :p

    Je commence à peine en Java donc je creuserai un peu plus pour utilisé l'actionListener même si ça parait pas en accord avec l'algo actuel au niveau timing.

    C'est gentil de me donner ton opinion!!

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

Discussions similaires

  1. Problème de thread : Plus de ressources système
    Par OliverSleep dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2006, 16h35
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 11h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 17h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 11h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 23h22

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