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 Embedded .NET Discussion :

Probléme de thread


Sujet :

Windows Embedded .NET

  1. #1
    Membre régulier
    Probléme de thread
    Bonjour,

    J'ai un problème de thread. Mon programme communique avec une appareil branché sur ma machine en usb. Après avoir initialisé les paramètres, je lance une fonction (EffectuerOperation) qui démarre le traitement sur mon appareil connecté. Pendant le traitement, l'appareil me renvoie des chaines de caractères que je dois afficher sur l'écran de ma machine. Je dois également pouvoir annuler le traitement, à tout moment, en appuyant sur le bouton annuler.Donc le traitement ne doit pas bloquer l'interface graphique de mon application. Mais je n'arrive pas à afficher, sur l'écran, les chaines de caractères que me renvoie l'appareil lors du traitement lorsque j'utilise les threads.

    Voici mon code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    System.Threading.Thread tEffectuerOp;
    delegate void ModifierLabelMessageCallback(string text);
    private ModifierLabelMessageCallback _modifierLabelMessage;
     
    public FormP()
    {
       //on init le delegate à la contruction de la fenetre
       this._modifierLabelMessage = new ModifierLabelMessageCallback(this.ModifierLabelMessage);
    }
     
    //Dans cette fonction on démarre le thread qui lance le traitement sur l'appareil en usb
    public string LancerTraitement()
    {
       //on init le thread
       this.tEffectuerOp = new System.Threading.Thread(new System.Threading.ThreadStart(this.EffectuerOperation));      
       this.tEffectuerOp.Start();
    }
     
    //Fonction du traitement
    public string EffectuerOperation()
    {
       //on fait des trucs avant
       ...
     
       //là on lance le traitement sur l'appareil usb qui, durant ses calculs, nous envoie des infos par la fonction AfficherMessage
       this.usbServer.Demarrer();
     
       //on continue à faire des trucs
       ... 
    }
     
    //Fonction qui permet de récupérer des messages à afficher pour voir l'avancé du traitement sur l'appareil usb.
    public void AfficherMessage(string messageAfficher)
    {
       //Une fois ici, l'invoke ne fait rien. Il reste bloqué. Il ne lance pas la fonction ModifierLabelMessage.
       this.Invoke(_modifierLabelMessage, new object[] {messageAfficher});
     
      //Si je met cette ligne ici :  this.labelMessage.Text = text;
      //J'obtiens une erreur qui me dit que je dois passer par un Control.Invoke.
    }
     
    //Modifie le label sur la fenetre de l'utilisateur.
    public void ModifierLabelMessage(string text)
    {
          this.labelMessage.Text = text;
          this.Refresh();
    }


    Merci pour votre aide.

  2. #2
    Membre régulier
    J'ai résolu mon problème en appelant le constructeur de la fenêtre ( FormP )directement dans un thread.