こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaのタイマープログラムの時間について

下記のjavaのプログラムは、タイマー動作の確認プログラムです。

タイマーの起動時間を1msにし、1000回タイマーを起動しており
トータルのタイマー時間は1秒と考えましたが、実際のタイマー時間は
20秒くらいかかります。

この件に関しまして、コメント頂けますと大変助かります。


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class TimerTest1 extends JFrame implements ActionListener{

Timer timer;
JLabel label;
int sec;

public static void main(String[] args){
TimerTest1 frame = new TimerTest1();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(10, 10, 300, 200);
frame.setTitle("タイトル");
frame.setVisible(true);
}

TimerTest1(){
sec = 0;
label = new JLabel();

JPanel labelPanel = new JPanel();
labelPanel.add(label);

timer = new Timer(1, this);

getContentPane().add(labelPanel, BorderLayout.CENTER);

timer.start();
}

public void actionPerformed(ActionEvent e){
label.setText(sec + " sec");

if (sec >= 1000){
timer.stop();
label.setText(" timer_stop");
}else{
sec++;
}
}
}
以上、宜しくお願いします。

投稿日時 - 2015-07-15 17:13:36

QNo.9012774

困ってます

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

Java の Timer 仕様は「指定された時間『以上』経過したことを保証する」だけで実際に 1ms の精度で正確にタスクが起動されることはほぼありません。実際 Swing のタイマーは Swing のバックグラウンド処理の影響で遅れを受けます。また、タイマーから呼び出された actionPerformed() の処理に 1ms 以上かかると次回のタスク起動が遅れます。それらの遅れが積み重なって20秒という時間がかかっていると思われます。

Java 標準の Timer は 1ms 精度が求められる処理を想定しておらず、本当にその精度が必要であれば Java RTS のような組込系のリアルタイム処理技術が必要になります。

ただ、実際にはそのような精度が求められる処理はまれで、例えば簡単なアニメーションであれば「16ms (約60fps) のタイマーを使用し、起動ごとに前回の起動からの時間 (16+アルファms) を計算してその分だけアニメーションを進める」といった方法で体感的に問題ないように実装します。

投稿日時 - 2015-07-15 18:18:09

補足

koiroha さま

早速の回答有難うございます。

使用者側とすれば、私が今回提示した程度のプログラムでは、1msは達成できなくても
2,3ms程度で割込みを実行できないかと考えています。
精度は全く必要ありません、つまりあるときは0.5msで動作し、次は3msで動作する、そして
偶には10msで操作するという具合でかまいません。
Timerの選択が間違っていたのかも知れませんね?
いずれにせよ、回答有難うございました。

投稿日時 - 2015-07-15 20:04:07

ANo.1

このQ&Aは役に立ちましたか?

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

回答(1)

あなたにオススメの質問