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 �clair�
    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
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    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 �clair�
    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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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