- ベストアンサー
イベントの発生を待つプログラムの効率的な方法について
- テキストボックスへの文字入力を待つプログラムの効率的な方法を教えてください。
- 現在、Form.Load()で呼び出されるプロシージャの中で、テキストボックスのキー入力を待機するプログラムを作成しています。
- ただし、Sleep()関数を使用するとアプリケーションがフリーズしてしまいます。効率的な方法をご教示ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ご要望を満たすものですと マルチスレッドによる処理が必要になる気がしますよ #1氏、#2氏の回答のように Windowsのプログラムは メッセージによって処理されています メッセージというのは『キーが押された』『どこかを再描画してください』などといった内容をWindowsから各プログラムに通知されます これは VB.NETなどの各プロシージャなどの内部に制御がある場合にはこの通知を受け取ることが出来ません これらを受け取るために Application.DoEvents を実行して Windowsから アプリケーションがメッセージを受け取れるようにする必要があります 複数回そのメインループの処理が必要な場合 Form_Loadイベントなどアプリケーションにとって1度しか実行されないプロシージャの中で処理するのは無理がありそうですよ
その他の回答 (3)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
> Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。 「Form_Loadによって呼び出される…」と「フォームのテキストボックス」が同じフォームであるならこの時点で矛盾します。Form_Loadイベントのイベントプロシージャが終了しないとフォームが表示されず、テキストボックスへの入力もできません。 もっと効率の良い方法を提示するには、やりたいことをもう少し具体的に提示してください。 例えば、「一連の処理の中で、ユーザーにテキストの入力を求め、完了するまでは先に進まない手続きにしたい」など。 この場合、フォームをダイアログとして表示(ShowDialog)するのが一般的、という回答を出せます。 > 今回はあくまでメインプロセス 同じExe内であれば、マルチスレッドが組まれていても「プロセス自体は同じ」です。メインスレッドで受け取りたい、という場合でも、マルチスレッドを自力で実装しない限りイベント駆動であってもシングルスレッドで動作します。
- cistronezk
- ベストアンサー率38% (120/309)
イベント駆動にそぐわない要望に思います。設計に疑問を感じます。 メインとなる処理をモジュールにまとめておき、KeyPressイベントの中で呼び出すのが自然だと思います。 Form.Loadだけで処理をするのなら、その処理を再実行する場合はどうするのでしょう?ループ処理をさらにループさせるのでしょうか?
- Caryo_t
- ベストアンサー率45% (112/246)
直感ですが、オンになっていないとループから抜けられないようになっていませんか? また、(ご存じだとは思いますが)DoEventsを入れないと、強制終了もできず、危険です。 ところで、わざわざループを使わなくても、必要個所でフラグを確認するだけで良いと思うのですが、ループを使う理由があれば教えてください。