この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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Linux上でのTomcatのServletプ...
-
「UIスレッド」「マルチスレッ...
-
JavaScriptからJAVAクラスを呼...
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
「タイプ初期化子が例外をスロ...
-
タブコントロールの問題 (VB)
-
Javaの関数名が長い?
-
Accessの連結・非連結オブジェ...
-
VB.NETでフォーム上にExcelのよ...
-
TableModelListener 通知出し方
-
BSアンテナのサイズ(札幌)に...
-
同じクラスにならない確率を教...
-
自作のクラスファイルがインポ...
-
ASP.NETでの共通コードの書き方...
-
エクセルVBAでのwitheventsにつ...
-
どこからも呼ばれていない無意...
-
VB.netのコンテナークラスとは...
-
【設計思想の質問】staticメソ...
-
JTableのイベント取得方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Javaでのデバッグコード削除
-
数値の定数を付ける時
-
Tomcat高負荷時の設定について
-
onBlurとonFocusの処理順序につ...
-
ExcelVBA で文字列の特定の文字...
-
JavaScriptからJAVAクラスを呼...
-
ラジオボタンの選択判定
-
アコーディオンメニューをアン...
-
ラベルの表示までが異常に遅い...
-
C#で別スレッドの終了を知りたい
-
WPF C#でF10のイベント取得方法...
-
JavaでVBのDOEVENTSと同様の処...
-
Javaプログラムからポップアッ...
-
Javaアプリケーション実行の返...
-
SwingUtilities.invokeLater(ne...
-
処理実行後、終了させないで最...
-
[Java] while(true)の意味
-
再度、スレッドが実行中かどう...
-
VBScriptでのWord印刷
おすすめ情報