状態と問題
重たい処理をBackgroundWakerで実行してます。
ファームにはキャンセルボタンと一時停止ボタンを設けておりますが、ボタンを押すことができません。
BackgroundWakerないのループ処理の最後にThred Sleepをすることでボタンのクリックイベントを拾うことは可能と知りましたが、そもそもBackgroundWakerでの処理が実行されてる間はカーソルがWait状態になっています。
実現したいこと
1.BackgroundWakerで重い処理を実行している間にカーソルをWait状態にしない。
2.Thred Sleep以外にボタンのクリックイベントを拾う方法等あればそちらを実装したい。
環境
VB.NET
ViualStudio2010
追記
外出のため編集できませんでした。
以下に大まかな処理のコードを記載致します。
SubBackgroundWorkerProgressChangedのSelectCaseの「-1」ではCaseの「-2」~「-4」では
スレッドの一時停止処理を、Select
参照しているDLLを実行させています。
DLL内では主に、DBを検索しデータの取得・更新を行っています。
Public oEvWork As New System.Threading.ManualResetEvent(True) Friend WithEvents BackgroundWorker As New System.ComponentModel.BackgroundWorker 'バックグラウンドワーカー一時停止フラグ(True:停止可/False:停止不可) Private mbWakerStopFlg As Boolean = False ''' <summary> ''' 一時停止 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub SubPause_Click(sender As System.Object, e As System.EventArgs) Handles Pause.Click mbStopFlg = True End Sub ''' <summary> ''' 再開 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub SubReStart_Click(sender As System.Object, e As System.EventArgs) Handles ReStart.Click mbStopFlg = False oEvWork.Set() End Sub ''' <summary> ''' バックグラウンドワーカー ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub SubBackgroundWorkerDoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork 'カウンター Dim iCnt As Integer For i = 1 To iCnt If mbStopFlg = True Then Me.BackgroundWorker.ReportProgress(i, -1) End If Me.BackgroundWorker.ReportProgress(i, -2) Me.BackgroundWorker.ReportProgress(i, -3) 'バックグラウンドワーカーがResetされているとSetされるまで無限に待機する oEvWork.WaitOne(System.Threading.Timeout.Infinite) Me.BackgroundWorker.ReportProgress(i, -4) Next End Sub ''' <summary> ''' バックグラウンドワーカーから処理を実行 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub SubBackgroundWorkerProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker.ProgressChanged 'カウンター Dim iCnt As Integer '引数をカウントに変換 iCnt = CType(e.UserState, Integer) '実行処理分岐 Select Case iCnt Case -1 oEvWork.Reset() Case -2 Case -3 Case -4 End Select End Sub
回答1件
あなたの回答
tips
プレビュー