質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3469閲覧

BackgroundWorkerのシグナル状態を取得したい。

xxx8

総合スコア41

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/11/08 00:51

編集2018/11/08 02:02

前提・実現したいこと

バックグラウンド処理が停止しているかを取得したいです。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WaitOne(0);
でどうでしょうか

投稿2018/11/08 01:36

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxx8

2018/11/08 01:44

ご回答ありがとうございます。 oEvWork.WaitOne(System.Threading.Timeout.Infinite) の前後でもWaitOne(0)の値は変わりません・・・・・・
y_waiwai

2018/11/08 01:48

oEvWork.WaitOne(0) でみてるでしょうか。 で、どういうふうに変わらないんでしょうか。
xxx8

2018/11/08 01:51

ご返信ありがとうございます。 oEvWork.WaitOne(0)で見ています。 Falseのまま値は変わりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問