- - PR -
ループ処理で中断・再開するには
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-04-11 22:39
せっかく作ってくれたので、ちょっと直してみました。
シングルスレッドですし、 キューイングなどは全部Frameworkとシステムがやってくれますから、 細かいことは気にしなくてOKです。
「利用できるものは何でも利用する」というスタンスでプログラムをしてますし、 他人にもそう評価されることが多いですが(いい意味でも悪い意味でも。)、 DoEventsは例外です。 私の中ではDoEvents()はとっくにObsoleteです。 VB6の時代からゴミ扱いでした。 [ メッセージ編集済み 編集者: れい 編集日時 2008-04-11 22:43 ] | ||||||||||||||||||||||||
|
投稿日時: 2008-04-11 23:18
れいさん、nakaPさん
コルーチンを使った方法のご提案やサンプルコードのご呈示ありがとうございました。 未だコルーチンなるものがよく理解できていませんが、お二人のコードを単体でテストしたところ、どちらも上手く動きました。 ただ、AddHandler Application.Idle, AddressOf Application_Idle のように、AddressOfを入れないとエラーになりました。 さて、私が行いたい以下の処理 Private Sub Main() Dim j As Integer For j = 1 To 100 フォームの入力項目の自動入力 ★wait処理 Next End Sub この★wait処理のところで、ボタンを押さなくてもwaitに入り、手作業による入力項目の修正処理を行いたいと思います。 そして、その処理が終わったら、「再開ボタン」を押して、次のfor nextから再開処理 をしたいと思います。 そこで、ご呈示いただいたコードを参考に試行錯誤しているのですが、うまくいきません。 例えば、★wait処理のところに、 AddHandler Application.Idle, AddressOf Application_Idle を記述してみると、waitすることなく、for nextが回ってしまいます。 理解不足で申し訳ございませんが、具体的な方法をご呈示いただければ幸いです。 | ||||||||||||||||||||||||
|
投稿日時: 2008-04-11 23:30
考え方を変えて下さい。 Windowsのメッセージの処理自体がループなので、その内側でループしている限り、解決できませんよ。 イメージ(あくまでイメージで正確なものではありません!!)
飛行船さんが求めているコードはButton1_Clickの部分でループに入り、そのまま中から出てこない状態です。 これでは次のイベントを起こすためのメッセージを受け取るループに戻れません。 #画面が再描画されず、ボタンが押せる状態にもなりません。 今回の場合、ループするのではなく、ボタンが押されたときに続きの処理をする、結果を表示してイベントを抜ける、ボタンが押されたときに続きの処理をするの繰り返しであるべきです。 ------- 追記 ところで、入力処理というのはどんなものなんでしょうか。 Text1.Text = "aaa"みたいにプロパティで設定しているのか、SendKeyみたいに文字入力をシミュレートしているのか。 SendKeyみたいなものなら、Button1をクリックした時点でフォーカスが移動するので、正しく処理されないかもしれませんし。 [ メッセージ編集済み 編集者: Azulean 編集日時 2008-04-11 23:35 ] | ||||||||||||||||||||||||
|
投稿日時: 2008-04-12 01:40
むー、そうなのか。 VB6ではループ処理が長いと画面が固まったように見えるので、多用してました。 まあそんなに複雑なことしてたわけじゃなかったので、たまたま問題なかったのかもしれません。
ごめんなさい、実際に書いたコードでは付けてたんですが、転写した時にぬかってたようです。
少し、コルーチンを勘違いされてるかもしれません。 【Wikipedia】 より
重要なのは以下の部分です。
なんか、無理にFor〜Nextを使おうとしてません? | ||||||||||||||||||||||||
|
投稿日時: 2008-04-12 10:07
Azuleanさん
ご回答ありがとうございます。 >ところで、入力処理というのはどんなものなんでしょうか。 Text1.Text = "aaa"みたいにプロパティで設定しているのか、SendKeyみたいに文字入力をシミュレートしているのか。 Textbox1.textのように、プロパティで設定しています。 今回のご指摘で、メイン部分でfor nextを使わないwaitのやり方がようやくわかってきました。 ありがとうございました。 nakaPさん ご回答ありがとうございます。 >なんか、無理にFor〜Nextを使おうとしてません? その通りでした。 クリック処理を上手く使えば、中断〜再開はわりと簡単にできることがわかりました。 また、コプロセスをどういう場合に使えばよいのかもよくわかりました。とても勉強になりました。 ありがとうございました。 | ||||||||||||||||||||||||
|
投稿日時: 2008-04-12 16:39
http://forums.microsoft.com/msdn-ja/showpost.aspx?postid=2381944&siteid=7&sb=0&d=1&at=7&ft=11&tf=0&pageid=0 この辺で暑苦しく語ってしまっていますので、参照ください。
ごめんなさい。実際にはコードを書いていません…。 とりあえず、うまく動いたようでなによりです。 こういったイベントドリブンの作法をきちんと覚えておけば、 信頼性が高く、レスポンスのいいアプリケーションを作れます。 たとえば、こちらも [イベントハンドラーの中でさらにイベントを起こすと、再帰的に呼び出されてしまう] http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44288&forum=7&start=16&16 同じような問題です。 与えられたフレームワークをhackして使い倒すのも楽しいですが、 そのまえに作法を覚えたほうが、効率がよいでしょう。 | ||||||||||||||||||||||||
|
投稿日時: 2008-04-12 18:34
れいさん
>こういったイベントドリブンの作法をきちんと覚えておけば、 信頼性が高く、レスポンスのいいアプリケーションを作れます 本当によくわかりました。 また、DoEventsを使うときの危険性もよくわかりました。他にもDoEventsを使ったプログラムがあり、どうも動作が不安定なところがあったので、見直していこうと思います。 貴重なアドバイスありがとうございました。 テッテさん マルチスレッドの手法のご紹介ありがとうございます。 これから、ご紹介いただいたURLなどを参考にして、マルチスレッドも勉強していこうと思います。 ありがとうございました。 | ||||||||||||||||||||||||
|
投稿日時: 2008-04-13 02:41
拝見させていただきました。 少し、自分なりにテストしてみたくなりました。 ただ、私としては完全には捨てきれないでしょうね、特にVB6では。 (未だVB6システムの保守をしてますので・・・) もちろん危険性は認識させていただきました。 れいさんのおかげで、自分のレベルが少し上がったのをはっきりと確認できました。ありがとうございます。 |