「平成」を感じるもの

Loopで処理を回しています。処理件数が多く、処理の途中で一時停止させ、DataGridViewに表示されている処理結果を目で確認ないしマウスでコピーしてから、処理を再開ないしキャンセルして終了させる仕様を作成中です。

MessageBoxを使用すれば、Loopは一時停止出来たのですが、MessageBoxだとDataGridView上の処理結果をマウスでコピーなど出来ません。

そこで、MessageBoxを使用せずに、以下のコマンドを書いてみたのですが、最初のStopFlag=Trueが効くだけで次のコマンドは一瞬で処理されLoopが続いてしまいます。いかにすればLoopを一時停止できるか教えてください。

<変数宣言>
Public StopFlag As Boolean
Public CancelFlag As Boolean
<前処理>
TextBox1.Text = "処理待ち" 'テキストボックスに処理ステータスを表しています。
TextBox1.Refresh()

<処理>
Do
Me.Cursor = Cursors.WaitCursor '砂時計開始
TextBox1.Text = "処理中" ’ステータスを処理中として表示
TextBox1.Refresh()

Application.DoEvents() 'ストップボタンを押下したらここでDoEventsさせます。
If StopFlag = True Then ’ここでLoopを一時停止させておきたいのです。
Me.Cursor = Cursors.Default '一旦砂時計を止めます
TextBox1.Text = "処理一時停止"
TextBox1.Refresh()
If StopFlag = False Then ’再開ボタンが押下されたらここで再開させたい。
TextBox1.Text = "処理中" ’処理中と表示させます
TextBox1.Refresh()
Me.Cursor = Cursors.WaitCursor '砂時計再開です
ElseIf CancelFlag = True Then ’キャンセルボタンが押下されれば、処理はLoopを抜けます。
TextBox1.Text = "キャンセル"
TextBox1.Refresh()
Exit Do
End If
Loop

'----------ストップボタン----------
Private Sub Button2_Click~
StopFlag = True
End Sub
'----------再開ボタン----------
Private Sub Button3_Click~
StopFlag = False
End Sub
'----------キャンセルボタン----------
Private Sub Button4_Click~
CancelFlag = True
End Sub

この質問に補足する

A 回答 (2件)

失礼、コルーチンを使うべきらしい。



http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …

この回答への補足

ありがとうございます。
今読んで、早速試しているところです。
結果踏まえて、また連絡差し上げます。

補足日時:2011/10/20 17:23
    • good
    • 0
この回答へのお礼

ありがとうございました。
掲載されていたIdleというわけにはいきませんでしたが、
If StopFlag = True Then
の後、StopFlag=FalseになるまでLoopというコマンドにしました。
また掲載されていた、Button1.Enabled = Falseなど役立ちました。

お礼日時:2011/10/20 20:20

シングルスレッドでは無理だね。



http://www.atmarkit.co.jp/fdotnet/dotnettips/436 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報