3

私はVS2010を使用しており、Windowsフォームアプリケーションに取り組んでいます。

そのため、(ユーザー入力に応じて)動的に作成されたスレッドがあります。これらのスレッドの処理にはしばらく時間がかかる場合があります(極端な場合は数日)。そのため、フォームにボタンを配置し、スレッドを「一時停止」または「一時停止」できるようにしたいのです。.suspendメソッドを調べたところ、置き換えられました(使用しようとしましたが、失敗することがあります。UIがクラッシュする原因になります)。そのため、これを行うための新しいメソッドは「waithandle」です。このドキュメントを読みましたが、使用方法がわかりません。

これは、各スレッドの基本構造です。

Do
     'time consuming operations
loop 'a number of times

次に、別のボタンに一時停止コードを配置します。すばやく一時停止することはそれほど重要ではありません。ループの次の実行で一時停止しても問題ありません(各実行は非常に高速で、数百回実行されます)。ループの開始時にウェイトハンドルチェックを行う必要があると想定していますが、実際にはこれを実装する方法がわかりません。これは私のウェイトハンドルの薄暗いコードです:

Dim waitHandles As System.Threading.EventWaitHandle = New System.Threading.AutoResetEvent(True)

すべてのスレッド(メインUIスレッドを除く)を一度に一時停止する必要があるため、待機ハンドルが1つだけ必要なことを意味すると思いますが、これについてはよくわかりません。

とにかく、誰かがdoループに入るコードと、一時停止ボタンに入るコードを教えてくれれば、他のすべてを処理できると思います。:)

どうもありがとう!

フレイザー


コメントから:

ありがとう!私はそれを動かしました。これが私の含意です:

Dim mre As New System.Threading.ManualResetEvent(True)

(これはコードの先頭(「パブリッククラスフォーム1」のすぐ下)にあり、スレッドでは次のようになります。

mre.WaitOne(), 

最後に、スレッドを一時停止/一時停止解除するボタンで:

mre.Reset() 'to resume the threads and, mre.Set() 'to pause the threads 
4

1 に答える 1

1

これにはManualResetEventを使用します。AutoResetEventは、待機しているスレッドがある回数だけ信号を送る必要があるという点で「ほぼセマフォ」です。これは、状況によっては厄介になる可能性があります。

シグナルされた(つまり設定された)イベントを作成し、システムコールがスレッド内のループに与える影響が無視できる適切なポイントでスレッド内で待機します。おそらく最も内側のループではありません。

'Pause'ボタンOnClick()でイベントをクリアし、'Resume' OnClick()で設定します。

申し訳ありませんが、実際のコードはありません'cos私はVBを持っていませんが、簡単に実行できるはずです:)

于 2012-08-24T07:19:30.670 に答える