2011-06-24 3 views
2

を再開します。一時停止し、私はスレッドを一時停止し、再開するには、このコードを持っているスレッド

public partial class frmMain : Form 
    { 
     (...)   
     ManualResetEvent wait_handle = new ManualResetEvent(true); 
     (...) 
    } 

private void frmMain_Shown(object sender, EventArgs e) 
    {      
      ThreadPool.QueueUserWorkItem(new WaitCallback(TheLoop)); 
    } 

private void TheLoop(object stateinfo) 
     { 
      bool hasInfo = true; 
      while (doLoop) 
      { 
       wait_handle.WaitOne(); 

       bool hasLines = GetInfo(); 
       if (hasLines) 
       { 
        //Consuming time Operation 1 
        System.Threading.Thread.Sleep(7000); 
        if (CurrentLine < line.Count - 1) 
         CurrentLine++; 
        else 
        {             
         bool hasInfo2 = GetInfo2(); 
         if (hasInfo2) 
         {        
          //Consuming time Operation 2 
          System.Threading.Thread.Sleep(7000); 
         } 


         CurrentLine = 0; 
        } 
       } 
       else 
        System.Threading.Thread.Sleep(40000); //Wait to query again 
      } 
     } 

private void btnPauseResume_Click(object sender, EventArgs e) 
     { 
      if (btnPauseResume.Text == "Pause") 
      { 
       btnPauseResume.Text = "Resume"; 
       wait_handle.Reset(); 
      } 
      else 
      { 
       btnPauseResume.Text = "Pause"; 
       wait_handle.Set(); 
      } 
     } 

上記のコードは、サイクル情報を示し、それは「最初に時間のかかる作業」が、doesnのを一時停止し、再開することを見つける作品第2の消費時間操作でスレッドを一時停止するためにボタンを押すと、これが継続し、最初のものが再び表示されたときに一時停止します。

私はここで何が欠けていますか? Thx

+0

もっと詳しく知るには? – CrazyDart

+0

編集CrazyDartのおかげで、私は複数のwait_handle.WaitOne()を読んだ。スレッドを一時停止または再開する必要があるたびに必要ですが、操作2の前にもう1つ追加しましたが、機能しませんでした。 – Somebody

+0

Consuming time操作では、DBから読み込み、呼び出しを使用してGUIに値を設定します。それだけだから、私はそれが問題になるとは思わない。 – Somebody

答えて

0

事はあなたがWaitOne()を置く場所です。例えば、Whileループ(私の例のような)を前に置くと、何回も一時停止ボタンを押しても、スレッドを止めることはできません。ループが始まって以来の論理ですが、もし私が最後にそれを置くと、それはうまくいくでしょう。

あなたのお手伝いをお待ちしております。

0

誰かがスレッドを一時停止したことはありません。別の脅威で実行しているクラスまたはメソッド内にデリゲートとイベントを作成します。 thredを一時停止するときはいつでもそのイベントを実行します。

+0

こんにちは、しかし、私は上記のコードでスレッドを一時停止して再開できることに気付きましたか?私の唯一の質問は、私の2番目の操作でスレッドを一時停止することができるということです。 – Somebody

1

あなたはWinFormsを使用しているので代わりにBackground Workerを使用すると考えましたか?スレッドを「一時停止」しようとするよりも簡単かもしれません。 CancellationPendingプロパティをチェックして、ユーザーが操作をキャンセルするかどうかを確認できます。リンクには見て良いサンプルがあります。

+0

ZeroVectorにお返事ありがとうございますが、私はプロジェクトの初めにバックグラウンドワーカーを検討していませんでしたが、今はプロジェクトが非常に大きく、私はすべてをもう一度変更したくありません。だから、私は第2の操作を一時停止しようとして前進しなければならない。 – Somebody

0

2回目の時間がかかる操作の前に配置された場合、WaitOneへの2回目の呼び出しが機能しないことがわかります。 ManualResetEventを使用しているので、待機ハンドルの状態は、SetまたはResetが呼び出されるまで続きます。つまり、Setを呼び出してスレッドを再開すると、WaitOneへの両方の呼び出しが通過します。同様に、Resetを呼び出してスレッドを一時停止すると、WaitOneの両方の呼び出しがブロックされます。もちろん、WaitOneへの複数の呼び出しがある場合、ワーカースレッドがどこで休止するかを予測することはできません。

+0

そうですね、ボタンを押したときに2つの操作を一時停止し、再開しても続行する必要がありますが、2回目の操作の前に2回目の「waitOne」を追加したときには機能しませんでした。 。ありがとうブライアン – Somebody

関連する問題