iアプリで「非活性モードから一定時間が経過すると休眠モードへ移行する」処理をする際、
以下のコードで「10:非活性状態です」の表示のまま休眠モードになってしまいます。
(「0:休眠状態です」の表示にしてから休眠モードにしたい。)
(2台の携帯電話で実行しましたが、同じになります。)
原因がわかる方、アドバイスをお願いします。
//一部省略しています
//変数 mode(活性=2・非活性=1・休眠=0)
public void processEvent(int w_type,int w_param) {
// タイマーイベント発生の場合に処理
if ((w_type==Display.TIMER_EXPIRED_EVENT) && (w_param==w_timerID)) {
counter++; //←時間をカウントしています
if(mode == 1 && counter > 10) {
//10カウントで休眠状態へ
mode = 0;
repaint();
counter = 0;
timer.stop();
sleep();
}
repaint();
}
}
public void paint(Graphics g) {
if(mode == 0) {
g.drawString(counter+":休眠状態です", 50, 50);
}
else if(mode == 1) {
g.drawString(counter+":非活性状態です", 50, 50);
}
else {
g.drawString(counter+":活性化状態です", 50, 50);
}
}
No.1ベストアンサー
- 回答日時:
まず、counter=0;を行う前にrepaintしていますから、数字が10のままになってしまうんじゃないですか。
repaint前に変数は初期化しておかないと。それからmode=0にしてrepaint後にsleepしているのですが、repaintは基本的に「可能な限り早く再描画処理を呼び出す」ということであって、常に再描画をし終わってから次の処理に進むわけではないでしょう。想像ですが、実際の再描画が行われる前にsleepが実行されてしまっているのでは? 例えば、再描画の処理を軽減するために、メソッドの実行が終わりidle状態に戻ってから再描画されるようになっている、などは考えられそうです。
休眠状態にするときには変数の初期化などだけ行っておき(timerは止めない)、次のprosessEventでスリープする、というようにしてはどうでしょう。
実際にやってないので違っていたらすみません。
ご指摘ありがとうございます。
public void processEvent(int w_type,int w_param) {
if ((w_type==Display.TIMER_EXPIRED_EVENT) && (w_param==w_timerID)) {
counter++;
if(mode == 1 && counter > 10) {
mode = 0;
repaint();
counter = 0;
}
else if(mode == 0) {
sleep();
}
repaint();
}
}
sleep()を一段階遅らせる(?)ことで解決できました。
ちなみに、質問に書いたコードでは、実機ではうまく動かなかったのですが
DoJaのエミュレータでは期待通りに表示されました。
(エミュレータの待ち受け起動の仕方は今日知りました;)
>repaintは基本的に「可能な限り早く再描画処理を呼び出す」ということであって、
>常に再描画をし終わってから次の処理に進むわけではないでしょう。
Kyon2_PaPaさんのおっしゃる通りだと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- 睡眠障害・不眠症・過眠症 高校生です。現在テスト勉強に追われながら平日、4時間半睡眠の状態で高校へ通っています。勉強時間に充て 5 2023/06/07 01:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 会社・職場 どのような生活スケジュールにすればいいですか? 特に睡眠のタイミングなど 勤務時間は移動時間も含んだ 3 2023/04/06 09:00
- 会社・職場 寝不足で仕事を休んでしまいました。通勤に片道35キロ、1時間かけて通っています。仕事はデスクワークで 6 2022/05/24 11:36
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- 会社・職場 逆流性食道炎で休職は甘えですか? 昨年12月からコロナに感染し回復した後、逆流性食道炎になりました。 3 2023/02/21 17:25
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- 就職 【至急】面接辞退しようか迷っています。助言お願いします。 24卒就活生です。実は明日にWebでの1次 5 2023/06/01 15:08
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# DataGridView のCellPaintin...
-
VB.NET フォーム上に描いたグ...
-
Exception occurred during eve...
-
DirectXのスプライト機能で3D回転
-
BMP画像を画像処理して連続に表...
-
エクセルVBAで、条件に一致する...
-
複数の変数を宣言する時、同時...
-
変数名の付け方
-
「タイプ初期化子が例外をスロ...
-
private static という変数の修飾
-
エクセルVBA 画像を貼り付ける...
-
パワーポイントのVBAでテキスト...
-
SQLを連続発行する時の正しい(?...
-
生成したインスタンスを削除す...
-
VBAでの[]
-
インスタンス参照でアクセスで...
-
コマンドライン引数のチェック
-
Java初級 引数に適用できません
-
エクセルVBAにおけるON TIMEメ...
-
C#のクラスで値渡しをする
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
C# DataGridView のCellPaintin...
-
VB.NETのSendMessageを教えてく...
-
canvasで表示されてる画像を1...
-
Exception occurred during eve...
-
requestanimationframeを一斉に...
-
Labelコントロールの背景をグラ...
-
SwingとEDT(イベントディスパッ...
-
C# リストビューの特定のセルの...
-
MFCでMSペイントみたいなツー...
-
画面のちらつきの原因が知りた...
-
JAVAでの背景画像表示
-
Androidで画像の中で指定した範...
-
このプログラミングをどう組み...
-
描画してもウィンドウをリサイ...
-
JavaScriptで直線を描画したい
-
SwingのpaintComponent(...
-
BMP画像を画像処理して連続に表...
-
Java 15パズルを作ったのですが...
-
<JFreeChart> 縦軸の値の間隔を...
おすすめ情報