- PR -

VBでのインターバルタイマ

投稿者投稿内容
Nakasaitama
会議室デビュー日: 2004/02/03
投稿数: 2
投稿日時: 2004-02-03 00:57
短時間でのインターバルタイマがうまく動作しなくて困っています。
10ミリ秒でのインターバルタイマを実現したいのですが、Windowsマシンによって
挙動がマチマチです。
あるマシン(VAIO Pen2,300MHz)では10ミリ秒でタイマがかかります。最新マシン(DELL Pen4,3GHZ)では10ミリ秒に設定しても15ミリでしかタイマがかかりません。
そこそこの精度(1ミリ秒以内)かつCPU低負荷で、任意のマシンでインターバルタイマを動作させる方法についてご教授ください。

Timer1.interval=10
Timer1.Enabled=False


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-03 06:31
引用:

Nakasaitamaさんの書き込み (2004-02-03 00:57) より:

Timer1.interval=10
Timer1.Enabled=False


 MSDNに記述がありますが、Timerは2つあります。片方は精度が低いです。どちらを使っていますか?
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-03 10:03
VBのタイマーで10ミリ秒の精度って出せます?
(純粋にぼくの疑問なだけですが・・・^^;
こういうのって、メッセージキューにメッセージがたまってたりすると
実際のタイマーイベントが処理されるタイミングはマチマチになって
しまうと思うのですが。
精度を出したい場合はAPIのマルチメディアタイマーを使うのが一番だと
思います。(VBでこのAPI使えるかどうか知りませんが^^;


--追加
Jittaさんへ、

>MSDNに記述がありますが、Timerは2つあります。片方は精度が低いです。どちらを使っていますか?

2つって見つからなかったんですが、タイマーコントロール以外にあるのですか?

タイマーコントロールは、

システムは、1 秒に 18 のクロック信号を発生させます。したがって、Interval プロパティはミリ秒単位で指定されますが、実際の時間間隔の精度は、せいぜい 18 分の 1 秒です。

だそうですね^^;

他にあるのであれば、ぜひ知りたいです。

[ メッセージ編集済み 編集者: りばぁ 編集日時 2004-02-03 10:11 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-03 10:16
引用:

りばぁさんの書き込み (2004-02-03 10:03) より:

VBのタイマーで10ミリ秒の精度って出せます?

精度を出したい場合はAPIのマルチメディアタイマーを使うのが一番だと
思います。(VBでこのAPI使えるかどうか知りませんが^^;


 えっとですね、「2種類」あるんですね。名前空間で言うと、
System.Threading.Timer
System.Timers.Timer
System.Windows.Forms.Timer … 55ミリ秒の精度
う〜ん、今MSDNを見ると、3種類でした。このうち、Windows.Forms.Timerは、55ミリ秒の精度に制限されています。ツールボックスには、おそらくこのTimerが配置されているんですね。そのため、ツールボックスにあるTimerを使うと、55ミリ秒以上の精度、まぁ秒単位ですね、でしか、使用できません。
 ミリ秒単位が必要な場合は、System.Timers.Timerを使ってください。



追記:
 あうあう。VB.NETです。VB6.0は、精度悪いのですよね、聞いた話。

さらに追記:
 ん???VB.NET?VB6.0?どっち?

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-03 10:21 ]
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-03 10:29
こんにちわ。

引用:

Jittaさんの書き込み (2004-02-03 10:16) より:

追記:
 あうあう。VB.NETです。VB6.0は、精度悪いのですよね、聞いた話。

さらに追記:
 ん???VB.NET?VB6.0?どっち?




なるほどw .NETの話しでしたか。

スレ主さんのコードから見ると、VB6.0のタイマーコントロールのように見えたもので、
こちらで勝手に判断してしまいましたが^^;

環境を書いて頂かないと、混乱のもとになると言うことが良く分かる一件ですね
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-02-03 11:07
引用:

(りばぁさん 投稿日時: 2004-02-03 10:29)
スレ主さんのコードから見ると、VB6.0のタイマーコントロールのように見えたもので、
こちらで勝手に判断してしまいましたが^^;

環境を書いて頂かないと、混乱のもとになると言うことが良く分かる一件ですね



いや(^^;、ここは.NETの会議室なんですから、デフォルトは.NETでしょう。
もしVB6の質問であれば単なる板違いということで・・・。

最初の投稿にある
> Timer1.Interval=10
> Timer1.Enabled=False

このコードはここだけを見れば、VB6のTimerコントロールの場合でも、
VB.NETでSystem.Windows.Forms.Timerクラスを使っても、
System.Timers.Timerクラスを使っても同じコードになります。

引用:

(Jittaさん 投稿日時: 2004-02-03 10:16)
追記:
 あうあう。VB.NETです。VB6.0は、精度悪いのですよね、聞いた話。



VB6までのTimerコントロールはSystem.Windows.Forms.Timerと同じで、
55ms程度の精度です。(でも、NT系では10msぐらいの精度が出たりします)

ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-02-03 13:04
System.Timers.Timer についてちょっと簡単な実験をしたんですけど、どうもElapsedEventArgs.SignalTime の精度がおかしいみたいです。以下、あくまでうちの環境の場合です。

Timer.Interval を 1 に設定した場合、この値を列挙させてみると 15[ms] 置きの値になります。つまり「複数回同じ値が設定されて発生」します。不思議に思ったので timeGetTime() を利用して計測してみると、きちんと 1-2[ms] 置きの値が計測できます。

この辺から考えて「System.Timers.Timer.Elapsed はきちんとした精度で発生するが、それに渡される ElapsedEventArgs.SignalTime の値は精度が 10-20[ms] ぐらいしかない」ようです。

それで ElapsedEventArgs.SignalTime は System.DateTime 型なので、この辺が原因ではないかと予想して、System.DateTime の挙動を少し調べてみたのですが、DateTime.Now を連続で呼び出したときの挙動がこれとそっくりです(Interval=0がずっと続き階段状に約15ms間隔で上昇していく)。この辺が原因ではないかなぁ、と予想しています。

というわけで、
・System.Timers.Timer の発生精度は問題ない(1[ms]まで)。
・ただそれを確認するためにはtimeGetTime, QueryPerformanceCounter等使わないとだめ(DateTimeの精度は悪い?)。
という感じかな、と現状判断してます。

※あくまで、限定的な実験による推測です。それが求められる場合きちんとした実験を自分でするべきです。
Nakasaitama
会議室デビュー日: 2004/02/03
投稿数: 2
投稿日時: 2004-02-04 00:47
大変申し訳ありません。
VB6.0&Windows2000で、使用したのはツールボックス78のタイマです。
色々と投稿いただき、様子が大体わかりました。当方の責任にて検証してみます。

ところで、ここからオカルトなのですが。
簡単に複数PCで確認したところ、デバイスがシステムに割り付けられているIRQの最大値が15のPCでは10msecインターバルタイマがかかります。ところがIRQが15を超えて割り付けられているPCでは10msecはかからず、15msec程度になります。どうもPC依存の可能性が大なようです。もともと55msecがせいぜいとのお話なので、10msecが実行されるのはオマケかも知れませんが。(IRQは0-15と思っていたのですが、16以上もあるのですね)

スキルアップ/キャリアアップ(JOB@IT)