解決済みの質問
この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
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
4人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(1件中 1~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