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

Windows Forms Discussion :

Que se passe-t-il lors de l'appel à la méthode Invoke si le thread courant est occupé ?


Sujet :

Windows Forms

  1. #1
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Points : 252
    Points
    252
    Par défaut Que se passe-t-il lors de l'appel à la méthode Invoke si le thread courant est occupé ?
    Bonjour,

    je dois maintenir une application développée par une autre personne que moi.
    Dans cette application, un timer exécutée au sein d'un UserControl appelle cycliquement une méthode appelée Lecture.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void Lecture()
    {
     If (this.InvokeRequired)
         this.Invoke(new MonDelegate(Lecture));
     else
        Traitement();
    }

    Ainsi l'appel de la méthode se fait dans le même thread que celui détenant le handle de fenêtre.
    Cette méthode fait appel à la méthode Traitement.
    Il arrive que le traitement soit plus long que le cycle d'exécution du Timer.
    Ainsi, la méthode Lecture sera appelée dans un autre Thread.
    Que se passe-t-il dans ce cas lors de l'appel à la méthode Invoke sachant que la méthode Traitement appelée précédemment n'est pas terminée ?

    Merci d'avance,
    Zoax.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut THREAD POOl,la queue des threads
    bonjour zaoax
    probablement pour ca qu'ils ont mis en place pool thread .Elle sera mise dans le pool de thread de l'application et attendra son tour pour etre excute.
    c'est pour ca qu'il y a meme des classes d'evenements(System.Threading.AutoResetEvent) dans System.Thread pour nous informer quand une tache est termine(appel est terminee).
    Et savoir ainsi si nous n'avons pas fait d'erreur de logique ,par exemple des boucles infinies,et estimer le temps requis par chaque thread.
    regarde sur ce lien http://www.developpez.net/forums/d10...e-mdi-threads/
    bon code.........

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Même si les noms de méthode sont les mêmes (Invoke, BeginInvoke, EndInvoke), l'asynchronisme des winforms est différent de celui de la threadpool.
    Le point commun dans les deux cas, c'est que Invoke met en queue la méthode passée en paramètre ; mais dans un cas, c'est dans la threadpool, et les différents méthodes Invoke-ées s'exécuteront dans les threads de la pool (tant qu'il y en a), tandis que Control.Invoke met tout dans la même queue, celle du thread créateur du contrôle.

    Donc pour répondre à la question initiale : une méthode passée en paramètre de Invoke sera exécutée lorsque le thread d'UI est libre, c'est à dire quasiment tout le temps si l'appli est bien foutue.
    Dans le cas ici: est-ce que Traitement est une méthode métier (ie qui va choper des trucs en base, ou fait un gros calcul) comme son nom le laisse supposer ? Parce que si c'est le cas, le code fait le contraire de ce qu'il faut Puisque ce que l'on Invoke, en général, est une méthode qui s'exécute très vite, et qui sert juste à MAJ l'UI avec le résultat d'une méthode métier longue.

    Mais en tous cas, là, les Traitement vont s'empiler dans la Queue, si leur durée d'excéution est plus longue que l'intervalle du timer.
    ಠ_ಠ

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Invoke met en queue la méthode passée en paramètre

    [...]

    une méthode passée en paramètre de Invoke sera exécutée lorsque le thread d'UI est libre
    Ce n'est pas tout à fait exact... Invoke met effectivement la méthode dans la queue, mais ne retourne pas tant qu'elle n'a pas été exécutée. Donc si le thread UI est déjà occupé, ça bloque... (c'est pour ça qu'il ne faut pas appeler Invoke à partir du thread de UI)

    Par contre BeginInvoke fait bien ce que tu décris

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ce n'est pas tout à fait exact... Invoke met effectivement la méthode dans la queue, mais ne retourne pas tant qu'elle n'a pas été exécutée. Donc si le thread UI est déjà occupé, ça bloque... (c'est pour ça qu'il ne faut pas appeler Invoke à partir du thread de UI)

    Par contre BeginInvoke fait bien ce que tu décris
    Oui, la précision est utile vu le contexte du post initial

    Quant à l'appel d'Invoke/BeginInvoke dans le thread de l'UI, j'y avais jamais réfléchi, mais c'est vrai qu'on peut imaginer tout un tas de trucs tordus
    ಠ_ಠ

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/05/2012, 08h36
  2. Que se passe t'il lors d'un déploiement avec Axis2 ?
    Par RudyWI dans le forum Services Web
    Réponses: 0
    Dernier message: 09/04/2009, 15h27
  3. Probleme lors de l'appel à une méthode
    Par doditch77 dans le forum C++
    Réponses: 10
    Dernier message: 07/01/2008, 00h58
  4. Que se passe t il lors de la pose d'un composant?
    Par korntex5 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 06/10/2005, 13h30
  5. [VB6] [Install] Que se passe-t-il lors du setup?
    Par petit scarabée dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 28/10/2002, 08h26

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