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

C++/CLI Discussion :

Souci avec Thread::Sleep ()


Sujet :

C++/CLI

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut Souci avec Thread::Sleep ()
    Bonjour à tous,

    J'ai un petit souci avec Thread::Sleep() qui bloque l'exécution de l'instruction StatusLabel->Text ...

    Pour expliquer clairement voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    {
    	for (int i = 0; i< 10; i++)
    	{
    		 StatusLabel->Text= i.ToString();
    		 ProgressBar->Value= i;
    		 Thread::Sleep(500);
    	}
    }
    Le StatusLabel ne s'affiche pas pendant l'exécution de la boucle mais uniquement à la fin avec la valeur 9 alors que la ProgressBar de son côté progresse bien à chaque incrément de i ..

    Pourquoi donc le StatusLabel ne se comporte pas comme la ProgressBar ?

    J'ai résolu le problème en remplaçant Thread::Sleep par un timer, mais je trouve ça lourdingue pour un simple StatusLabel

    Bonne journée et merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    >mais je trouve ça lourdingue pour un simple StatusLabel

    Heu, la, vous ramez contre le courant.


    En Winform :

    La modification du texte est une action qui se propage vers le GDI.
    Le GDI a été optimisé pour ne pas surcharger inutilement le système en bufférisant les modifications et en mettant à jour l'affichage quand le processus n'a plus d'autres actions à faire. L'affichage est donc non prioritaire.
    Ainsi, dans votre programme, vous pouvez changer des milliers de label à énormément d'endroit différent sans que chaque modification entraine un passage en mode Kernel, arbitrage sur le bus PCI pour accéder à la RAM vidéo, modification de la rame vidéo, ...

    En faisant un Sleep, vous ne dites pas à l'OS que le thread n'a rien à faire et donc qu'il peut commencez à faire le rafraichissement, mais que le thread est interdit de CPU pendant un temps fixé minimum.

    Le comportement que vous indiquez semble indiquer que l'optimisation GDI n'est pas active sur une ProgressBar, ce qui est assez cohérent avec son utilisation habituelle dans une boucle de traitement. C'est une modification "synchrone" donc très couteuse.

    Donc, moralité, n'utilisez JAMAIS Sleep.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Donc, moralité, n'utilisez JAMAIS Sleep.
    Merci Bacelar pour l'explication très claire ..

    C'est la première que j'utilisais Sleep, d'habitude j'utilise un timer et donc je n'avais jamais rencontré ce problème.

    C'est en voulant rendre mon code plus léger à la lecture que j'ai pensé à mettre un Sleep à la place du timer et pouff! c'est pas la bonne idée

    Bonne journée

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En gros, Sleep() n'est vraiment pas fait pour les threads d'interface graphique utilisateur (GUI). C'est bien pour des threads de travail, ou à la rigueur dans une console.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Méthode récursive avec Thread.sleep : StackOverflowError
    Par J-A-B dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 14/12/2011, 16h05
  2. Problème avec thread.sleep
    Par e.londres dans le forum Android
    Réponses: 3
    Dernier message: 02/09/2011, 16h19
  3. JButton avec boucle while contenant thread.sleep(1000)
    Par v4np13 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/10/2007, 20h31
  4. petit soucie avec POE ( Component::Pool::Thread )
    Par siaoly dans le forum Modules
    Réponses: 21
    Dernier message: 22/07/2006, 18h25
  5. Petit soucis avec Thread::Queue et une classe
    Par vodevil dans le forum Web
    Réponses: 16
    Dernier message: 09/06/2006, 21h41

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