このwhile文、ずっと回っているのでしょうか?(iアプリ・Java)
//trueを入れたwhile文
while(true){
if(keyEvent == Display.KEY_1){
//ボタン「1」をプッシュされた時の処理(内容は文字列出力など、適当に。)
}
//keyEventを初期化。(少なくとも、「1」ではない数字に)
keyEvent = -555;
}
//キーイベント(※iアプリ)の処理
public void processEvent(int type, int param) {
if (type==Display.KEY_PRESSED_EVENT) keyEvent=param;
}
このような記述を書籍で見掛けました。
動作としては、問題なく動いているのですが、
これは、キーイベント待ちの無限ループという感じなのでしょうか?
ループしている間、常に回っていて、ハードウェアに仕事をさせている(電力消費)ということなのでしょうか?
No.2ベストアンサー
- 回答日時:
Thread.sleep()が入っているのであればかなりマシです。
しかしそれでも、キー入力が無視される可能性があることは変わりません。下記の※B~※Cの間に次のキー入力が来た場合はいいですが、※A~※Bの間に入力されたキーの情報は※Bで上書きされて消えてしまいます。
while(true){
if(keyEvent == Display.KEY_1) { ※A
//ボタン「1」をプッシュされた時の処理(内容は文字列出力など、適当に。)
}
//keyEventを初期化。(少なくとも、「1」ではない数字に)
keyEvent = -555; ※B
try {
Thread.sleep(100);
} catch (Exception e) {
}
※C
}
>要するに、キーイベントを受け付けるごとに、ある特定の作業を1回行い、
>作業が終わったら、また、キーイベントを受け付ける状態で待機、
>といった内容にしたいわけです。
行いたい作業の内容にもよりますが、processEvent()と走り続けるrun()メソッドに分けずに、processEvent()の中でその「特定の作業」を実行してしまえばいいのでは?
>processEvent()と走り続けるrun()メソッドに分けずに、processEvent()の中でその「特定の作業」を実行してしまえば
ずっと、このことを考えていたのですが、
これをするのと、しないのとで、何が異なるのか、
私の中で整理できなかったため、なかなかお返事することができませんでした。
現在もその状態は続いておりますが、ほったらかしにしておくわけにもいきませんので、
簡単ではありますが、「お礼」を書かせて頂きました。
私はまだJava初心者であるため、run()がどのような動きをするのか、
よく理解できていないようです。
この run() については、
書籍に記載されているサンプルソースの中で使われていたので、
見よう見まねで使っている、といった感じです。
またよろしければ、色々と教えてください。
No.1
- 回答日時:
即刻その書籍をゴミ箱にたたき込みたくなるようなコードですね。
- ビジーループで無駄にCPU時間を消費している (他のスレッドの動きが邪魔される、電力も浪費する)
- たとえば「1」をプッシュされた場合の処理中に「2」が押されたとして、processEvent()がkeyEventの値をDisplay.KEY_2に書き換えても、while(true)ループの中でkeyEvent = -555;と上書きされて「2」の入力が無視される可能性がある
回答ありがとうございます。
書籍の内容を多少、はしょっているため、
その私の、はしょり方に問題があったかもしれません。
まず、その点を、お詫びいたします。(汗)
ということで、ちょっと補足しますと、
keyEvent = -555;
try {
Thread.sleep(100);
} catch (Exception e) {
}
と、実際には、スリープ処理が入れられていました。
おそらく、これがあることで、
ご指摘の「『2』の入力が無視される可能性が」という問題には
対処できているのかな、と思います。
(このスリープ処理にそんな機能があるとは知らず、
はしょってしまった私に問題がありそうです。申し訳ないです。
※もし、そういう機能があったのだとしたら、の話ですが。)
それと、質問文に記載したコードは、
public class MyClass extends Canvas implements Runnable {
private int keyEvent=-555;
//細かい処理(はしょります)
public void run() {
//「ここに納まる」
}
}
上記のように、
run()の中に入れられる形となります。
これが、while(true)の無限ループとどう関係があるかは分かりませんが、
質問当初は関係ないと思い、
ただただwhile(true)だけに着目し、その無限ループについて、
質問をさせていただきましたが、
こちらも、はしょってはいけない類だったのでしょうか。
実際、このアプリが悪いのかは分かりませんが、
超異常的なスピードで電池が消耗していました。
この無限ループは、
基本的に、キーイベントを待ち続ける間、ずっとCPUを動かし続けているのでしょうか?
こういった処理を、電力消費を抑えた形で行いたい場合、
どういうコードを書くと良さそうでしょうか。
要するに、キーイベントを受け付けるごとに、ある特定の作業を1回行い、
作業が終わったら、また、キーイベントを受け付ける状態で待機、
といった内容にしたいわけです。
もし、宜しければ、また教えて下さい。宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) Excel VBA マクロ ブロック崩しのコードについて。 1 2022/06/22 12:33
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
SwingUtilities.invokeLater(ne...
-
Tomcat高負荷時の設定について
-
Javaでのデバッグコード削除
-
Linux上でのTomcatのServletプ...
-
データ未入力時のエラー処理が...
-
doGetとdoPostの違い
-
JAVAにおける画像のJPEG保存の...
-
スレッド1とスレッド2を交互に...
-
数値の定数を付ける時
-
Javaプログラムからポップアッ...
-
VBScriptでPing
-
[Java] while(true)の意味
-
Delphiのマルチスレッドの割り...
-
「タイプ初期化子が例外をスロ...
-
次の日本語の意味を教えて下さい
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
doGetとdoPostの違い
-
JavaScriptからJAVAクラスを呼...
-
Javaでのデバッグコード削除
-
WPF C#でF10のイベント取得方法...
-
数値の定数を付ける時
-
Tomcat高負荷時の設定について
-
Javaプログラムからポップアッ...
-
JavaでVBのDOEVENTSと同様の処...
-
JSP、サーブレットの初期処理
-
switch文の中に、throws new Ex...
-
ExcelVBA で文字列の特定の文字...
-
VBScriptでのWord印刷
-
ラジオボタンの選択判定
-
Javaアプリケーション実行の返...
-
C#で別スレッドの終了を知りたい
-
ftp 同時複数接続の負荷テスト...
-
ブラウザを閉じた後のサーバ側...
-
javaのプログラムが止まる
-
[Java] while(true)の意味
おすすめ情報