前提・実現したいこと
バックグラウンド処理が停止しているかを取得したいです。
System.Threading.ManualResetEventのオブジェクトに対して
現在がSet() なのかReset()状態なのかを取得したいです。
oEvWork.WaitOne(System.Threading.Timeout.Infinite)
で判別できるとは思うのですがイマイチ理解できていません。
実現したいことはAボタンが押されたときに
現在のシグナル状態を取得するというものです。
該当のソースコード
VB.NET
1 2Public oEvWork As New System.Threading.ManualResetEvent(True) 3Private oEvCancel As New System.Threading.ManualResetEvent(True) 4Friend WithEvents BackgroundWorker As New System.ComponentModel.BackgroundWorker 5 6Private Sub SubBackgroundWorkerDoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork 7 8 For i = 0 To iCnt - 1 9 'oEvWorkがResetされているとSetされるまで無限に待機する 10 oEvWork.WaitOne(System.Threading.Timeout.Infinite) 11 12 13 System.Threading.Thread.Sleep(iSleepTime) 14 15 'バックグラウンド操作の進捗状況 16 Me.BackgroundWorker.ReportProgress(i) 17 Next 18 End Sub 19 20 ''' <summary> 21 ''' Startボタン 22 ''' </summary> 23 ''' <param name="sender"></param> 24 ''' <param name="e"></param> 25 ''' <remarks></remarks> 26 Private Sub SubBtnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click 27 Startする 28 oEvWork.Set() 29 End Sub 30 31 ''' <summary> 32 ''' Cancelボタン 33 ''' </summary> 34 ''' <param name="sender"></param> 35 ''' <param name="e"></param> 36 ''' <remarks></remarks> 37 Private Sub SubBtnCancel_Click(sender As System.Object, e As System.EventArgs) Handles btnCancel.Click 38 'Cancelする 39 oEvWork.Reset() 40 End Sub 41 42 ''' <summary> 43 ''' Aボタン 44 ''' </summary> 45 ''' <param name="sender"></param> 46 ''' <param name="e"></param> 47 ''' <remarks></remarks> 48 Private Sub SubBtnA_Click(sender As System.Object, e As System.EventArgs) Handles btnA.Click 49 'シグナル状態を取得する 50 51 '取得したシグナル状態で分岐処理 52 if xxxx Then 53 'Set()状態の時 54 55 Else 56 'Reset()状態の時 57 58 End If 59 End Sub
補足情報(FW/ツールのバージョンなど)
Visual Studio2010
VB.NET
### 追記
oEvWork.WaitOne(System.Threading.Timeout.Infinite)の前後でフラグの値を変更して
実装するほかないのかと思います。
実現したいことはAボタンが押されたときに
現在のシグナル状態を取得するというものですが
最終的な目的は、バックグラウンド処理が一時停止中の場合のみ
他画面に遷移するということです。
いいコーディング等あればご教授ください。
以下コードです。
Public oEvWork As New System.Threading.ManualResetEvent(True) Private oEvCancel As New System.Threading.ManualResetEvent(True) Friend WithEvents BackgroundWorker As New System.ComponentModel.BackgroundWorker 'New Private bFlg As Boolean = False 'New Private Sub SubBackgroundWorkerDoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork For i = 0 To iCnt - 1 'ReSet()状態 bFlg = False 'oEvWorkがResetされているとSetされるまで無限に待機する oEvWork.WaitOne(System.Threading.Timeout.Infinite) 'Set()状態 bFlg = True System.Threading.Thread.Sleep(iSleepTime) 'バックグラウンド操作の進捗状況 Me.BackgroundWorker.ReportProgress(i) Next End Sub ''' <summary> ''' Startボタン ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub SubBtnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click Startする oEvWork.Set() End Sub ''' <summary> ''' Cancelボタン ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub SubBtnCancel_Click(sender As System.Object, e As System.EventArgs) Handles btnCancel.Click 'Cancelする oEvWork.Reset() End Sub ''' <summary> ''' Aボタン ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub SubBtnA_Click(sender As System.Object, e As System.EventArgs) Handles btnA.Click 'バックグラウンド処理が途中の場合は待機 Do While bFlg = False 'カーソルを待機状態にする Cursor.Current = Cursors.WaitCursor Loop 'カーソルを元に戻す Cursor.Current = Cursors.Default 'バックグラウンド処理が一時停止中なので他画面を開く Using oFrm As FrmXXX = New FrmXXX oFrm.ShowDialog() End Using End Sub
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/08 01:44
2018/11/08 01:48
2018/11/08 01:51