このwhile文、ずっと回っているのでしょうか?(iアプリ・Java)

解決済みの質問

このwhile文、ずっと回っているのでしょうか?(iアプリ・Java)

この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;
}

このような記述を書籍で見掛けました。
動作としては、問題なく動いているのですが、
これは、キーイベント待ちの無限ループという感じなのでしょうか?
ループしている間、常に回っていて、ハードウェアに仕事をさせている(電力消費)ということなのでしょうか?

投稿日時 - 2010-09-04 01:17:28

連想キーワード:

QNo.6156997

困ってます

質問者が選んだベストアンサー

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()の中でその「特定の作業」を実行してしまえばいいのでは?

投稿日時 - 2010-09-04 19:54:27

お礼

>processEvent()と走り続けるrun()メソッドに分けずに、processEvent()の中でその「特定の作業」を実行してしまえば

ずっと、このことを考えていたのですが、
これをするのと、しないのとで、何が異なるのか、
私の中で整理できなかったため、なかなかお返事することができませんでした。
現在もその状態は続いておりますが、ほったらかしにしておくわけにもいきませんので、
簡単ではありますが、「お礼」を書かせて頂きました。

私はまだJava初心者であるため、run()がどのような動きをするのか、
よく理解できていないようです。
この run() については、
書籍に記載されているサンプルソースの中で使われていたので、
見よう見まねで使っている、といった感じです。
またよろしければ、色々と教えてください。

投稿日時 - 2010-09-05 12:09:41

ANo.2

4人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(1件中 1~1件目)

ANo.1

即刻その書籍をゴミ箱にたたき込みたくなるようなコードですね。

- ビジーループで無駄にCPU時間を消費している (他のスレッドの動きが邪魔される、電力も浪費する)
- たとえば「1」をプッシュされた場合の処理中に「2」が押されたとして、processEvent()がkeyEventの値をDisplay.KEY_2に書き換えても、while(true)ループの中でkeyEvent = -555;と上書きされて「2」の入力が無視される可能性がある

投稿日時 - 2010-09-04 09:02:46

お礼

回答ありがとうございます。
書籍の内容を多少、はしょっているため、
その私の、はしょり方に問題があったかもしれません。
まず、その点を、お詫びいたします。(汗)

ということで、ちょっと補足しますと、

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回行い、
作業が終わったら、また、キーイベントを受け付ける状態で待機、
といった内容にしたいわけです。

もし、宜しければ、また教えて下さい。宜しくお願い致します。

投稿日時 - 2010-09-04 11:41:18

あわせてチェックしたい
  • while文と無限ループの違い ...
  • for文while文の無限ループの違いについて ...
  • RTOSの無限ループ ...
PR
【回答募集中】花粉にひと言、物申す![ 詳細 ]

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら