一回も披露したことのない豆知識

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

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

A 回答 (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()の中でその「特定の作業」を実行してしまえばいいのでは?
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2010/09/05 12:09

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



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

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

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

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

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


おすすめ情報