タイマーよりも早くデータを検出する方法

解決


オレゴン  2003-03-12 03:43:19  No: 106282

皆様,はじめまして.早速質問させてください.

タイマーのIntervalを1にすると1μ秒ごとにタイマーを発生
させられますよね?しかし,実際はシステム上,時間間隔の
精度は18分の1秒が限界だと本を見て知りました.
実際にソフトを走らせ,配列にデータを入れると,
1秒間に20個程度のデータしか入りませんでした.

VBを使用して1μ秒ごとにデータを検出させる方法が
ありましたら教えてください.
ようは,一秒間に1000個のデータが入るようにしたい
のです.
よろしくお願いします.


Say  2003-03-12 15:59:31  No: 106283

>タイマーのIntervalを1にすると1μ秒ごとにタイマーを発生
>させられますよね?
させられません。

>実際はシステム上,時間間隔の
>精度は18分の1秒が限界だと本を見て知りました.
システムの精度ではなく、WM_TIMWRの発行間隔です。

>VBを使用して1μ秒ごとにデータを検出させる方法が
>ありましたら教えてください.
ありません。

>ようは,一秒間に1000個のデータが入るようにしたい
>のです.
1μ秒ごとだったら100万個のはずですが?

1msecでいいのなら、timeSetEvent(API)で可能です。


オレゴン  2003-03-13 23:34:29  No: 106284

Say様
ご回答ありがとうございます.

>システムの精度ではなく、WM_TIMWRの発行間隔です。
  :
>1msecでいいのなら、timeSetEvent(API)で可能です。

WM_TIMWR,timeSetEvent(API)とはどのようなものでしょうか?
ヘルプを見ましたが,どういったものなのか?つかめない状態です.


たかみちえ  URL  2003-03-14 03:15:18  No: 106285

WM_TIMERというのはウィンドウメッセージのひとつ
  メッセージについてはうちの旧学校…以下略 http://TakamiChie.tripod.co.jp/
timeSetEventはAPIのひとつ(そのまんま(^^ゞ)です。
  同じく旧学校をごらんください。
  ヘルプにはごく一般的なAPIしか載ってないですから、
インターネット上を検索するしかないです。


Y2  2003-03-14 07:13:04  No: 106286

Sayさんが間接的に訂正してますけど、わからない人がいるかもしれないので訂正させてもらいます↓
>タイマーのIntervalを1にすると1μ秒ごとにタイマーを発生
1μ → 1m
マイクロμ:10の-6乗 = 1/1,000,000
ミリm:10の-3乗 = 1/1,000

VBのタイマーに限らず、Windowsの時間の管理は経験上、全部msですね。
(Win32APIのGetTickCount関数:システム起動後の経過時間をミリ秒(ms)単位で収得)
(.netのEnvironment.TickCountプロパティ:システム起動後の経過時間をミリ秒(ms)単位で収得)

>実際にソフトを走らせ,配列にデータを入れると,
>1秒間に20個程度のデータしか入りませんでした.
タイマーは最高で1ms間隔で動作するはずなので、PCのスペックが足りていなかったてことはありませんか?

>WM_TIMWR,timeSetEvent(API)とはどのようなものでしょうか?
>ヘルプを見ましたが,どういったものなのか?つかめない状態です.
VBのヘルプとしてMSDNが付いてきたと思いますけど、MSDNならWinAPIの記述くらいはあると思います。
キーワードにtimeseteventと入力すれば説明が出るはずです。
このとき、フィルタがVBになっていると表示されないので、フィルタなし、あたりにすると良いかと思われます。

どうしても、マイクロ秒単位で検出させたい場合は、自分なら、水晶発振子を使ってタイマーを自作するかもしれません。(笑)


Y2  2003-03-14 07:19:26  No: 106287

あ、すみません、オレゴンさんはtimeSetEvent関数のヘルプを既に読んでいたみたいですね。


たかみちえ  URL  2003-03-14 08:06:15  No: 106288

> タイマーは最高で1ms間隔で動作するはずなので、PCのスペックが足りていなかったてことはありませんか?
  えっ?
詳しい説明は忘れましたけど、
Timerコントロールのタイマー(普通のタイマー)は、
OSの機能なので、
どうやってもせいぜい20ミリ秒程度の精密さしか出ませんよ。
(マルチメディアタイマーを使えば話は別ですけど)
  Windows9xではもっと精度がよくなかったと思うので、
  結局100ミリ秒程度のタイマーにしか使えないと思いますけど…。


Say  2003-03-14 09:50:33  No: 106289

VBのTimerコントロールはWM_TIMERメッセージを利用しています。
WM_TIMERはせいぜいWin95系で55msec,WinNT系で10msec間隔程度です。

タイマAPIとしては、SetTimerとtimeSetEventがありますが、
後者のほうが精度が高いようです。
(ほぼ1msec間隔でコールバック関数を呼べます。)
標準で利用可能なタイマでは最も精度が高いでしょう。
(勿論、CPU時間を浪費していいのなら、ループの中で
etTickCountやtimeGetTimeの値を監視する、という手もあります。
この場合も、GetTickCountよりtimeGetTimeのほうが精度がでます。)


Y2  2003-03-14 19:45:37  No: 106290

VBのタイマーって限界があったんですか!?すみません知りませんでした。

どうせなら、好きな分解能でタイマーを自作するっていうのはどうでしょう?
QueryPerformanceCounter(Win32API)を使えばかなり高い精度で時間を計測できます。
QueryPerformanceCounterから返ってくる値の1秒当たりのカウントはQueryPerformanceFrequencyで獲得できます。
ひょっとすると、PCによってはマイクロ秒単位で計測することも可能かもしれません。


オレゴン  2003-03-14 23:47:52  No: 106291

皆様,ご回答・ご意見ありがとうございます.
初心者の私からすると,ここの掲示板はとても役に立ちそうです.
(皆さんプロだぁ〜)
Windowsの基本から学ばなければならないかもしれません.
(イベント・オブジェクトとかの意味もしっかり分かっていないので)

結論,Timerコントロールを使用しては,目的は果たせないようです.
(最低限10μSでデータを処理しなければならないので)
データを取得する機器メーカーに問い合わせてみます.


たかみちえ  URL  2003-03-15 03:50:22  No: 106292

何か別の方法はないんでしょうか?
たとえば、機器の変更を通知するコールバックがあれば、それを使うなど。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加