2010-11-18 7 views
0

私は添付の画像のように表示されるフォームを持っています。私は、この質問に関係するフォームの2つの部分、TabControlとPanelをイメージに示しています。パネルはTabControl内にないことに注意してください。スレッドを停止し、UIイベントを処理させ、スレッドを「再起動」する方法はありますか?

alt text 私の状況では、ボタンが緑色のパネルで緑色で表示されたときに連続して実行されるスレッドがあります。スレッドは、私が接続しているデバイスをポーリングし、TabControlの下部にある "Status" GroupBoxのコントロールを更新します。ユーザーがTabControl(tabControl_Enterイベント)のコントロールをクリックすると、クリックされたコントロールに必要なIOを実行できるように、スレッドが繰り返しを終了できるようにするManualResetEventをトリガーします。スレッドを停止するためのコードは次のとおりです。私は、現在行われているように、ボタンを押すことではなく、自動的にスレッドを再起動しているしたいと思っ何

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

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

      try 
      { 
       updateSynch(); 
      } 
    } 

。私がしようとしているのは、条件付きで "bazillion" UIイベントハンドラのそれぞれの中でStartSynchThread()を呼び出すことによってスレッドを再起動する必要がなくなります。

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

これを処理するための先例やまともなパラダイムがあります:StartSynchThread()は次のように定義されて?どのようにするかというコンセプトなしに、デバイスからの応答を取得した後でイベントを生成するためにデバイスでIOを実行する機能を変更できると思っていましたが、それは控えめなようです。

アイデア?私はあなたの洞察に感謝します。ありがとう。

答えて

2

ボタンをクリックするだけで簡単に消すことができるのであれば、定期的に適切な条件をチェックしてボタンを「プッシュ」する(synchWaitHandle.Set();)フォームにtimerを入れるだけでいいはずです。

+0

完全に単純な解決策です。まさに私が望んでいたもの。ボタンを押すためのハンドラは、スタート/ストップにどのような小さなロジックがあるかを処理するので、私はそれを十分に簡単に使用できます。ありがとう。 –

関連する問題