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 :

Methode Invoke et multithread


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Methode Invoke et multithread
    Bonjours à tous,

    Je débute avec c# et le multithreading et je pense ne pas avoir tout saisie sur le fonctionnement de la methode Invoke.

    Mon problème est le suivant :
    J'ai un thread qui reçoit des messages par reseau et appelle des events selon le type de message.

    J'aimerai qu'un des events puisse modifier l'UI (donc un des données utilisées dans le thread UI), on occurence ce serait une simple ListBox.

    Voilà comment je procéde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void OnActionsListDataChange()
    {
         this.Invoke(new NoParam(UpdateActionsListUI));
    }
     
    private void UpdateActionsListUI()
    {
         this.moWaitingActionsListBox.Items.Clear();
         ...
    }
    La fonction OnActionListDataChange est biensure celle qui ecoute l'event envoyé par le réseau.

    Ceci marche tres bien sauf si l'event declenchant OnActionsListDataChange() est appelé plusieurs fois à la suite dans quel cas j'obtiens la callstack de l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Error on message callback calling : <message type='ActionSystem' sender_uid='4' event='WaitingActionAdded' action_id='16'/>
       à System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
       à System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
       à System.Windows.Forms.Control.Invoke(Delegate method)
       à MonitoringTool.EntityPanel.OnActionsListChange() dans D:\Project\AITool\MonitoringTool\EntityPanel.cs:ligne 59

    Voilà j'espère avoir été assez claire pour que quelqu'un puisse m'eclairer .

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Etrange Voir le message
    Ceci marche tres bien sauf si l'event declenchant OnActionsListDataChange() est appelé plusieurs fois à la suite
    Dans ce cas essaye de rajouter les éléments dans une List<T> (en vérifiant bien de d'utiliser un lock lors de l'accès à la liste). Et du côté de l'UI met un timer avec un intervalle de 500 ms ou 1s dans lequel tu récupérera le contenu de la liste (dans le lock) et ensuite tu affichera les différents éléments (hors du lock pour ne pas bloquer tout le monde pendant l'opération).

Discussions similaires

  1. Method invoked sur HandleExternalEventActivity
    Par BATCHOS CON TEQUILA dans le forum Windows Workflow Foundation
    Réponses: 1
    Dernier message: 16/02/2009, 11h45
  2. Réponses: 1
    Dernier message: 21/05/2008, 19h18
  3. Method invoke avec List<generics>
    Par youx21 dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2007, 09h11
  4. Réponses: 6
    Dernier message: 08/03/2007, 14h55
  5. [Reflexivite]exception ArrayIndexOutOfBoundsException methode invoke
    Par caro_a dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/07/2006, 11h35

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