プログラムの強制終了

タグの編集
投稿者 ちょうちょ  (学生) 投稿日時 2009/10/14 21:32:38

プログラムでwhileで繰り返している途中でボタンを押せばそのプログラムを強制的に終了させる方法を教えてもらえませんか?
投稿者 うぃ  (その他) 投稿日時 2009/10/14 21:38:17
> 投稿者 ちょうちょ   (学生)   投稿日時 2009/10/14 12:32:38  

> プログラムでwhileで繰り返している途中でボタンを押せばそのプログラムを強制的に終了させる方法を教えてもらえませんか? 
 
内部でPEEKMESSAGEを呼び出し、キーが押されたイベントを取得したらbreakするようにしたらいいのではないでしょうか?(C風に考えてみた)
投稿者 Knyacky  (中学生) 投稿日時 2009/10/15 01:52:36
ここでは変数aが10になるまでループさせるということにします。

       While a <= 10
                     a += 1
                    System.Windows.Forms.Application.DoEvents()
               End While

を入れると、ユーザーの割り込みが可能になるはずです。この状態で、終了させるコード
    End

とか
           Close()

とやるといいはず。
なら
       While a = 10
                     a += 1
                    DoEvents
               Wend

です。
投稿者 ちょうちょ  (学生) 投稿日時 2009/10/15 19:29:15
>うぃ様

詳しいコードを良かったら教えてもらえませんか?

>Knyacky様 

このコードでやってみましたが割り込めませんでした。

パソコンから電圧機器に、ある電圧をかけたり0にしたりをvb.netからおくっているのですが、それの緊急停止ボタンを作りたいんです。

このコードを入れてもformがかたまったまま反応してくれませんでした。
投稿者 ヴァン  (社会人) 投稿日時 2009/10/15 20:12:24
BackgroundWorkerを使った方が良いのでは?

DoWork内で監視処理を行う。
その中で停止すべきかどうか判断する。


Public Class Form1
    '監視処理の開始 
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        Me.BackgroundWorker1.WorkerSupportsCancellation = True
        Me.BackgroundWorker1.RunWorkerAsync()
    End Sub

    '非常停止ボタン 
    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
        Me.BackgroundWorker1.CancelAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.ObjectByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        While True
            If Me.BackgroundWorker1.CancellationPending = True Then
                e.Cancel = True
                Exit While
            End If
            '監視処理など 
        End While
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.ObjectByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If e.Cancelled = True Then
            MsgBox("非常停止")
        End If
    End Sub
End Class


投稿者 ちょうちょ  (学生) 投稿日時 2009/10/15 20:31:57
>ヴァン様

vb2003をつかってますが、BackgroundWorkerが無いのですが…

何か特別なことをする必要があるのでしょうか?

初心者ですいません。
投稿者 ?-?  (その他) 投稿日時 2009/10/15 20:57:46
> vb2003をつかってますが、BackgroundWorkerが無いのですが…
本当は最初に使っているバージョンを書いて欲しいのですが・・・

もちろん、開発環境だけでなく、動作させる環境(OS等)も書くのですよ。
投稿者 ヴァン  (社会人) 投稿日時 2009/10/15 21:20:32
VB2003なのか。

http://www.atmarkit.co.jp/fdotnet/mthread/index/index.html

ここ見てマルチスレッドの勉強してね、としか言えない。
投稿者 brv  (中学生) 投稿日時 2009/10/15 21:23:55
>vb2003をつかってますが、BackgroundWorkerが無いのですが…
VB2003ではBackgroundWorkerはありません。確かVB2005以降だったと思います。

Threadを使えば同じようなことができます。
http://www.atmarkit.co.jp/fdotnet/vb2005/vb2005_04/vb2005_04_01.html
↑中にThreadのサンプルも入ってます
投稿者 brv  (中学生) 投稿日時 2009/10/15 21:24:49
あ… 思いっきりかぶりました。すみません。
投稿者 ヴァン  (社会人) 投稿日時 2009/10/15 21:59:24
VisualStudio2008 Expressバージョンに乗り換えた方が楽だと思いますよ。
もしかしてOSが古いとか?
投稿者 ちょうちょ  (学生) 投稿日時 2009/10/16 00:17:54
>ヴァン様、brv様

サイト紹介ありがとうございます

ずっと考えてましたが、なかなか骨の折れる作業ですね…

簡単にいけるかと思ったのですが…もう少しがんばってみます

(ちなみにOSはXP使用です)