2010-11-18 9 views
0

J'ai un formulaire qui apparaît comme indiqué dans l'image ci-jointe. J'ai deux parties du formulaire qui concernent cette question: le TabControl, et le Panel, comme indiqué dans l'image. Il convient de noter que le panneau n'est PAS dans TabControl. Ma situation est que j'ai un thread qui s'exécute en continu quand le bouton, affiché dans fondre-vos-yeux verts dans le panneau, est cliqué. Le thread interroge le périphérique avec lequel j'interface et met à jour les contrôles dans le "Status" GroupBox au bas du TabControl. Lorsque l'utilisateur clique sur un contrôle dans le TabControl (événement tabControl_Enter), je déclenche un ManualResetEvent qui permet au thread de terminer son itération afin que je puisse effectuer l'IO requis par le contrôle cliqué. Le code à suspendre le fil est la suivante:Comment arrêter un thread, autoriser le traitement d'un événement d'interface utilisateur, puis "redémarrer" le thread?

private void StopSynchThread() 
    { 
     synchWaitHandle.Reset(); 
     //various UI changes 
    } 

private void updateSynchStat() 
    { 
     while (true) 
     { 
      synchWaitHandle.WaitOne(); 

      try 
      { 
       updateSynch(); 
      } 
    } 

Ce que je voudrais faire est de redémarrer alors automatiquement le fil, au lieu de par le bouton presse, comme cela se fait actuellement. Ce que j'essaie d'éviter, c'est d'éviter de redémarrer le thread en appelant conditionnellement le StartSynchThread() dans chacun des gestionnaires d'événements de l'interface utilisateur "bazillion". StartSynchThread() est défini comme:

private void StartSynchThread() 
    { 
     synchWaitHandle.Set(); 
    } 

est-il un précédent ou d'un paradigme décent pour gérer cela? Sans aucun concept de la façon de le faire, je pensais que je pouvais modifier ma fonction qui effectue l'E/S avec l'appareil pour générer un événement après avoir reçu une réponse de l'appareil, mais cela semble inélégant.

Des idées? J'apprécie vos idées. Merci.

Répondre

2

Si vous pouvez vraiment le déclencher avec un simple clic de bouton, vous devriez être en mesure de mettre un timer sur le formulaire qui vérifie périodiquement les bonnes conditions, puis appuyez sur le bouton (appel synchWaitHandle.Set();) automatiquement .

+0

Solution parfaitement simple. Exactement ce que j'espérais. Le gestionnaire de la pression sur le bouton gère le peu de logique qu'il y a au démarrage/arrêt, donc je peux l'utiliser assez facilement. Merci. –

Questions connexes