プロが教える店舗&オフィスのセキュリティ対策術

現在、テキストボックスへの文字入力を待つプログラムを作っております。
Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。
方針としては、まずBoolean型のフラグを用意し、まずTextBoxのKeyPressイベントでこのフラグをオンにし、メインのプロシージャでは必要個所でDoループを回してこのフラグを確認し、オンになっていたらオフにしてループを抜け出すというプログラムです。
このループの中にSleep()関数を入れたりしても、ループのところでアプリケーションがフリーズしてしまいます。(ブレークポイントなどで確認しました)
もっと効率のよい方法をご存知でしたらご伝授ください。
(KeyPressイベントの中に直接処理を書けばいいじゃないか、とおっしゃるかもしれませんが、今回はあくまでメインプロセスから読む必要があったため、質問をさせていただきました。)

A 回答 (4件)

ご要望を満たすものですと マルチスレッドによる処理が必要になる気がしますよ



#1氏、#2氏の回答のように
Windowsのプログラムは メッセージによって処理されています
メッセージというのは『キーが押された』『どこかを再描画してください』などといった内容をWindowsから各プログラムに通知されます

これは VB.NETなどの各プロシージャなどの内部に制御がある場合にはこの通知を受け取ることが出来ません
これらを受け取るために Application.DoEvents を実行して
Windowsから アプリケーションがメッセージを受け取れるようにする必要があります

複数回そのメインループの処理が必要な場合
Form_Loadイベントなどアプリケーションにとって1度しか実行されないプロシージャの中で処理するのは無理がありそうですよ
    • good
    • 0

> Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。



「Form_Loadによって呼び出される…」と「フォームのテキストボックス」が同じフォームであるならこの時点で矛盾します。Form_Loadイベントのイベントプロシージャが終了しないとフォームが表示されず、テキストボックスへの入力もできません。

もっと効率の良い方法を提示するには、やりたいことをもう少し具体的に提示してください。

例えば、「一連の処理の中で、ユーザーにテキストの入力を求め、完了するまでは先に進まない手続きにしたい」など。
この場合、フォームをダイアログとして表示(ShowDialog)するのが一般的、という回答を出せます。

> 今回はあくまでメインプロセス

同じExe内であれば、マルチスレッドが組まれていても「プロセス自体は同じ」です。メインスレッドで受け取りたい、という場合でも、マルチスレッドを自力で実装しない限りイベント駆動であってもシングルスレッドで動作します。
    • good
    • 0

イベント駆動にそぐわない要望に思います。

設計に疑問を感じます。
メインとなる処理をモジュールにまとめておき、KeyPressイベントの中で呼び出すのが自然だと思います。
Form.Loadだけで処理をするのなら、その処理を再実行する場合はどうするのでしょう?ループ処理をさらにループさせるのでしょうか?
    • good
    • 0

直感ですが、オンになっていないとループから抜けられないようになっていませんか?


また、(ご存じだとは思いますが)DoEventsを入れないと、強制終了もできず、危険です。

ところで、わざわざループを使わなくても、必要個所でフラグを確認するだけで良いと思うのですが、ループを使う理由があれば教えてください。
    • good
    • 0

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

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