2011-02-17 3 views
0

Mon problème est que j'ai besoin d'un thread qui effectue des opérations sur Serialports. J'ai implémenté une classe worker qui appelle des méthodes d'autres objets pour lire les valeurs des ports série. Le thread doit le faire pendant qu'un attribut volatile privé est vrai. Si elle est définie sur false, la boucle est en cours d'arrêt. Dans la boucle, je lève un événement pour passer des eventargs à l'interface graphique, afin qu'il puisse être mis à jour. Dans mon GUI WPF, j'attrape l'événement et je traite les eventargs, quand les travailleurs attribuent encore du travail (un autre attribut volatile).C# wpf Le thread ne se termine pas correctement

Tout fonctionne correctement avec le thread, lorsque je ne déclenche pas l'événement dans la classe worker. Mais quand je déclenche l'événement le fil ne va pas à l'état arrêté parfois (pas toujours)

Code de travailleur:

public void StartWork() 
    { 
     int i = 0; 
     while (this._continue) 
     { 
      this.StillRunning = true; 
       try 
       { 

        if (measureDispesner) 
        { 
         Dispenser.GetStatus(); 
        } 
        if (MeasureScale) 
        { 

         Dispenser.Scale.Weigh(); 
        } 

        OnProgressChanged(new ProgressChangedArgs(Dispenser, Dispenser.Scale)); 
        Console.WriteLine("Executed measuring " + i++.ToString() + " ScaleWeight: " + Dispenser.Scale.Status.CurrentStableWeight.ToString()); 
       } 
       catch (Exception e) 
       { 
        //throw e.InnerException; 
       } 
       finally 
       { 
        // System.Threading.Monitor.Exit(this); 
       } 


     } 
     Console.WriteLine("Stopped after: " + i++.ToString()); 

     this.StillRunning = false; 


    } 

eventHandler dans l'interface graphique WPF:

void worker_ProgressChanged(object sender, M5.Objects.Dispenser.ProgressChangedArgs e) 
    { 
     M5.Objects.Dispenser.Worker MyWorker = (M5.Objects.Dispenser.Worker)sender; 
     while (MyWorker.Continue) 
     { 
      // Wait while the worker is still running - code angs here 
      //return; 
     } 
     System.IO.MemoryStream ms;// = M5.Support.ResourceManager.ResMan.ConvertImageToMemoryStream(M5.Support.ResourceManager.ResMan.BottleImage); 


     if (this.objDispenser.IsAvalaible) 
     { 
      this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate() 
      { 
       this.txtComPort.Text = e.DispenserPort; 
       this.lblDispenserStatus_Dispenser.Content = e.DispenserMedikament; 

...

Qu'est-ce que je fais de mal ?! Comment puis-je mettre à jour mon threadsafe GUI? J'ai également essayé Monitor pour empêcher d'autres codes d'appeler à nouveau la fonction workerthread ... Merci d'avance, Marc!


Merci pour la réponse rapide! Non, ce n'est pas vraiment ce que je veux, mais j'essayais d'empêcher l'exécution de code GUI dans le gestionnaire d'événements car Thread.Join() ne fonctionne pas lorsqu'il essaie d'exécuter le code de l'interface graphique. Donc je n'ai jamais de fil arrêté. Lorsque je passe l'indicateur _continue avec l'événement eventargs, je peux maintenant empêcher l'exécution du code de l'interface utilisateur graphique

Cela fonctionne bien jusqu'à maintenant.

void worker_ProgressChanged(object sender, M5.Objects.Dispenser.ProgressChangedArgs e) 
    { 
     if (e.StopUI) 
     { 
      return; 
     } 

Mais pour l'intérêt, qu'entendez-vous avec compensation l'attribut? A-t-il la valeur nulle nulle part?

Répondre

0

Mais quand je déclenche l'événement le fil ne va pas à l'état arrêté parfois (pas toujours)

Ah, obtenu à aimer jeter quelques négations supplémentaires. Si je comprends bien votre code, dans votre gestionnaire d'événements worker_ProcessChanged, vous attendez que le thread se ferme (MyWorker.Continue devenant faux). Est-ce vraiment ce que tu veux? Autant que je puisse voir, vous n'effacez pas Continue ou _continue n'importe où. Peut-être que ce que vous voulez dans votre gestionnaire d'événements est quelque chose de plus dans le sens de ceci? Si ce n'est pas le cas, il peut être prudent de reprendre votre question une autre fois et de l'exprimer plus clairement.

+0

Au moins, j'ai trouvé un moyen qui fonctionne correctement: je passe le continue falg avec les eventargs et empêche le code gui de s'exécuter quand continue est faux ... –

Questions connexes