イベントの重複 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 るしぇ  (社会人) 投稿日時 2009/10/21 19:35:22
> ながーい処理を途中でとまるかどうか判断する機能は何を使えばいいんですか?
daive さんや ?-? さんの書き込みにつながります。
単語の意味が分からなければコンピュータ用語辞典ででも調べてください。
辞書に載ってる基礎用語レベルですので。

基本的に1つのプログラムで1つの処理を実行すると、他の処理は待機状態になります。
?-? さんの書かれたイベントキューの仕組みです。
まぁ、キューに溜まってくれればいいのですが、タイムアウトでそのアプリケーションが
応答していないと判断されたり、キーボードを押されたという情報が実行されず、処理落ち
になったりもしますね。

つまり普通にやれば、ながーい処理をやってる時点で最優先ボタンは押せません。
(押しても反応しません)
1つのながーい処理を実行しながら、「画面の入力を受け付ける」という処理も同時に
実行できるようにする必要があります。これにスレッドという考えが必要です。

VB2005 以降なら BackgroundWorker クラスがよく使われます。
http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(VS.80).aspx
それ以前なら Thread クラス。「マルチスレッド」というキーワードも有効です。
http://msdn.microsoft.com/ja-jp/library/aa289496(VS.71).aspx

ここまで勉強すれば「ながーい処理の途中で画面からの入力を受け付ける」ことができる
ようになります。

そこから、daive さんの書き込みのような設計で画面から入力された結果を
ながーい処理に伝えることを考えます。強制終了は良くないので、よく使われる手は
画面の入力から中止フラグの意味を持つ変数を変更します。ながーい処理は都合の
いいタイミングで中止フラグを確認し、中止の命令が出ていたら処理を中止します。

この「都合のいいタイミング」はその処理の内容によって違います。ループ処理なら
毎回ループの先頭で確認するとか、5回ループが回ったら確認するとか、プログラム次第です。
ループ処理なら、処理を中止するという意味ではループを抜ければいいとなります。
投稿者 ???  (社会人) 投稿日時 2009/10/21 04:10:04
>?-?さん
正直なところ全然わかりません

>るしぇさん

ながーい処理を途中でとまるかどうか判断する機能は何を使えばいいんですか?

全部自分で作ったプログラムです。
投稿者 るしぇ  (社会人) 投稿日時 2009/10/21 02:19:34
ながーい処理を途中で止めるには、ながーい処理自体に途中で止まるか
どうかを判断する機能があることが前提です。
(強制終了を考える人も居ますが、これはメモリ上にゴミを残したり、
最悪PCを壊す危険な考え方だと思います)

別のプログラムを呼んでいたり、自分で制御できないような処理が
あるなら難しいかもしれません。

全部自分の作ったプログラムの話なら、そのように作れるような
機能は用意されています。
投稿者 ?-?  (その他) 投稿日時 2009/10/21 01:42:57
そのButton1の処理がループ等で時間がかかるなら、たぶんそれにあわせた、スレッド処理を行ってDoEventのようなので処理しているでしょうから、キーイベント処理も受け取れるでしょうけど・・・

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
の処理が走ったら、その処理が終わるまで(returnするまで)か、Windowsに制御を戻すようにするまで、キーボードを押されたというメッセージ等はキューに入ったままで貯まっているということは理解できてますか?

投稿者 daive  (社会人) 投稿日時 2009/10/20 23:12:50
イベントドリブン型プログラムを理解できていますか?

普通に行うには、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Button1_Click イベント処理

(この間で、中止ボタン、または、キーボードからの中止入力)
 中止入力あるか?


Button1_Click イベント処理終了


キー入力イベント
中止処理か?
キー入力イベント終了

中止ボタンイベント
中止処理か?
中止ボタンイベント終了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

になるかと、Button1_Click イベント処理中に
キーボードのスキャンコードを取って処理中断も
考えられますが、お作法として、いかがなものかと。
投稿者 ???  (社会人) 投稿日時 2009/10/20 22:19:48
中断でいいです。

可能ですか?
投稿者 ?-?  (その他) 投稿日時 2009/10/20 21:10:07
> 投稿者 ???   (社会人)   投稿日時 2009/10/20 11:52:13  
> VB.NETで

>   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

> の中に新たにキーボードのあるボタンを押したらButton1の内容はクリアされてある処理が行われる

> というようなプログラムを作ることは可能なのでしょうか?

> 最優先ボタンみたいなものです。 
 
Button1の処理中に中断したいとかそういう意味なんでしょうか?

ボタンを押してすぐにキーを叩く、なんてあまり無いような気がしますが・・・
投稿者 ???  (社会人) 投稿日時 2009/10/20 20:52:13
VB.NETで

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

の中に新たにキーボードのあるボタンを押したらButton1の内容はクリアされてある処理が行われる

というようなプログラムを作ることは可能なのでしょうか?

最優先ボタンみたいなものです。