TIMERの正確さについて
投稿者 くぁさ  (学生)
投稿日時
2010/1/12 21:57:16
timerカウンタで10ms待つプログラム作ったんですけどこれって本当に正確なんでしょうか
投稿者 ん  (その他)
投稿日時
2010/1/12 22:26:48
> 投稿者 くぁさ (学生) 投稿日時 2010/01/12 12:57:16
> timerカウンタで10ms待つプログラム作ったんですけどこれって本当に正確なんでしょうか
最低10msは待ちます。
待った後の動作は他のプログラムの実行状態によりますが。
> timerカウンタで10ms待つプログラム作ったんですけどこれって本当に正確なんでしょうか
最低10msは待ちます。
待った後の動作は他のプログラムの実行状態によりますが。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2010/1/13 00:08:42
Timer コントロールの事なのか、Timer 関数の事なのか曖昧ですが、後者(コントロール)の方だとしたら、その精度は約10.0~54.295ms とされています(OS によって異なります)。
また、タイマー通知 (VB6ならTimerイベント、.NETならTickイベント) 内の処理に時間がかかってしまい、処理中に次のタイマー通知が来てしまうと場合、その処理は後回しにされます。また、その処理待ちイベントが複数溜まった場合、それらは次の一回分にまとめられる事になります。
> 本当に正確なんでしょうか
上記のような理由から、処理内容によっては誤差が累積する可能性がありますので、経過時間を正確に知りたい場合には、「測定を開始したときの時刻」を覚えておき、タイマーのイベントが通知されるたびにそれを「現在時刻」と照らしあわせて、何ミリ秒経過したのかを算出すると良いでしょう。
また、タイマー通知 (VB6ならTimerイベント、.NETならTickイベント) 内の処理に時間がかかってしまい、処理中に次のタイマー通知が来てしまうと場合、その処理は後回しにされます。また、その処理待ちイベントが複数溜まった場合、それらは次の一回分にまとめられる事になります。
> 本当に正確なんでしょうか
上記のような理由から、処理内容によっては誤差が累積する可能性がありますので、経過時間を正確に知りたい場合には、「測定を開始したときの時刻」を覚えておき、タイマーのイベントが通知されるたびにそれを「現在時刻」と照らしあわせて、何ミリ秒経過したのかを算出すると良いでしょう。
投稿者 くぁさ  (学生)
投稿日時
2010/1/14 21:38:49
解答ありがとうございます
ということは
55ms以下はその都度確認して
55ms以上はぴったりでていて信頼していいということですね?
ということは
55ms以下はその都度確認して
55ms以上はぴったりでていて信頼していいということですね?
投稿者 るしぇ  (社会人)
投稿日時
2010/1/14 21:51:23
>55ms以上はぴったりでていて信頼していいということですね?
どこにそのような説明が書いてあるのか分かりませんでした。
精度というのは誤差として許容される範囲だから、常にその程度の狂いが
生じる可能性があるということでしょう。
>処理内容によっては誤差が累積する可能性がありますので
累積すればいくらでも狂うと言っています。
どこにそのような説明が書いてあるのか分かりませんでした。
精度というのは誤差として許容される範囲だから、常にその程度の狂いが
生じる可能性があるということでしょう。
>処理内容によっては誤差が累積する可能性がありますので
累積すればいくらでも狂うと言っています。
投稿者 くぁさ  (学生)
投稿日時
2010/1/14 22:03:58
インターバルを100にして
それを10回刻むとしたら
1回の刻みで55ms前後のずれが生じるということですか?
最悪55×10=550msずれるということですか?
それを10回刻むとしたら
1回の刻みで55ms前後のずれが生じるということですか?
最悪55×10=550msずれるということですか?
投稿者 daive  (社会人)
投稿日時
2010/1/14 22:20:13
参考:(ソースが確認できたわけではないので。)
グーグル:TIMER 誤差
http://www.google.co.jp/search?hl=ja&q=TIMER+%E8%AA%A4%E5%B7%AE&lr=lang_ja
WindowsにおけるSleep(1)の精度について
http://hp.vector.co.jp/authors/VA007219/rtc_pic.html
より、下記
The system clock may run fast when you use the ACPI power management timer as a high-resolution counter on Windows 2000-based, Windows XP-based, and Windows Server 2003-based computers
http://support.microsoft.com/kb/821893/en-us
Halaacpi.dll
Halmacpi.dll
Halmps.dll
Halacpi.dll
Halx86.dll
の違いによるものらしいですが。
RTCにしろ、X-TALにしろ、PCは安い部品を
使っているので、温度による誤差とか、OS/アプリ要因を
考えると、計時として、どこまでなら正確といえるかどうか。
測定機の精度は、求めていないと思いますし。
(PCに、測定機並の精度を求めちゃいけないと、思っています。)
グーグル:TIMER 誤差
http://www.google.co.jp/search?hl=ja&q=TIMER+%E8%AA%A4%E5%B7%AE&lr=lang_ja
WindowsにおけるSleep(1)の精度について
http://hp.vector.co.jp/authors/VA007219/rtc_pic.html
より、下記
The system clock may run fast when you use the ACPI power management timer as a high-resolution counter on Windows 2000-based, Windows XP-based, and Windows Server 2003-based computers
http://support.microsoft.com/kb/821893/en-us
Halaacpi.dll
Halmacpi.dll
Halmps.dll
Halacpi.dll
Halx86.dll
の違いによるものらしいですが。
RTCにしろ、X-TALにしろ、PCは安い部品を
使っているので、温度による誤差とか、OS/アプリ要因を
考えると、計時として、どこまでなら正確といえるかどうか。
測定機の精度は、求めていないと思いますし。
(PCに、測定機並の精度を求めちゃいけないと、思っています。)
投稿者 へ  (社会人)
投稿日時
2010/1/15 23:20:09
そもそも、何がしたいんですか?
投稿者 しげ  (社会人)
投稿日時
2010/1/17 06:56:21
おっ。やはり50msあたりが限界なんですね。
僕もこの方法でやって50ms以下のタイマーが正確でないなぁと思っていました。
.NET系VBだと他にもタイマーを計る方法があるようで
System.Threading.TimeやSystem.Timers.Timerクラスが用意されているようです。
僕もこの方法でやって50ms以下のタイマーが正確でないなぁと思っていました。
.NET系VBだと他にもタイマーを計る方法があるようで
System.Threading.TimeやSystem.Timers.Timerクラスが用意されているようです。
投稿者 (削除されました)  ()
投稿日時
2010/1/18 03:32:51
(削除されました)
投稿者 (削除されました)  ()
投稿日時
2010/1/19 02:25:20
(削除されました)
投稿者 (削除されました)  ()
投稿日時
2010/1/21 09:39:15
(削除されました)
投稿者 在浩  (社会人)
投稿日時
2010/1/21 09:44:17
より正確な時間を必要とするアプリケーションの場合
Apiのコンポーネントのうち、Gettickcount関数を参照してください。
getticount関数は、system timerを使用するため、誤差率が1 / 1、000,000に小さくなっています。
* MSDNの抜粋
GetTickCount
The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. If you need a higher resolution timer, use amultimedia timer or a high-resolution timer.
Apiのコンポーネントのうち、Gettickcount関数を参照してください。
getticount関数は、system timerを使用するため、誤差率が1 / 1、000,000に小さくなっています。
* MSDNの抜粋
GetTickCount
The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. If you need a higher resolution timer, use amultimedia timer or a high-resolution timer.