2

+/- ミリ秒のタイミング精度を達成するために取り組んでいます。スレッド間の時間を 10 ミリ秒にしたいのですが、時間を測定すると 15 ミリ秒近くになります。

問題が時間の測定方法に起因するのか、それとも時間を正確に測定していて遅延が発生しているのかを理解しようとしています。 CreateTimerQueueTimer

私のコードは次のようになります

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <chrono>
#include <ctime>
using namespace std;
int current;
long long* toFill;
void talk()
    {
    chrono::time_point<chrono::system_clock> tp = \
        chrono::system_clock::now();
    toFill[current++]=chrono::duration_cast<chrono::milliseconds>(tp.time_since_epoch()).count() ;
    }

int _tmain(int argc, _TCHAR* argv[])
    {
    HANDLE hTimer;
    current = 0;
    toFill = new long long[1000];
    CreateTimerQueueTimer(&hTimer,NULL, 
        (WAITORTIMERCALLBACK)talk,NULL,
        0,10,0);
    _sleep(3000);
    DeleteTimerQueueTimer(NULL,hTimer,NULL);
    for (int i = 1;i<current;i++)
        {
        cout << i << " : " << toFill[i]-toFill[i-1]<< endl;
        }
    return 0;
    }

出力は次のようになります

...
161 : 16 <-- Should be 10
162 : 15
163 : 16
164 : 16
...
4

3 に答える 3

5

Windows のタイマーとリアルタイム クロックの精度は、クロック ティック割り込みレートによって制限されます。デフォルトでは 1 秒あたり 64 回、1/64 秒 = 15.625 ミリ秒になります。あなたが見たように。

その速度を上げることは実際には可能です。プログラムの開始時にtimeBeginPeriod(10)を呼び出して、10 ミリ秒の精度を取得します。

于 2013-01-21T13:04:55.210 に答える
1

CreateTimerQueue は、正確なタイミングを意図したものではありません。下でスレッドプールを使用するため、大幅な遅延が発生する可能性があります。

MSDN のCreateTimerQueueTimer 関数ドキュメントから:

コールバック関数は、スレッド プールのキューに入れられます。これらのスレッドはスケジューリングの遅延の影響を受けるため、タイミングはアプリケーションまたはシステムで他に何が起こっているかによって異なります。

于 2013-06-28T15:33:12.390 に答える
0

15ミリ秒よりも優れた解像度が必要な場合は、これが役立つことを願っています。

Windows用の継続的に更新される高解像度のタイムプロバイダーを実装する

(リンクの更新について@MaxTruxaに感謝します)

時間の測定について:WindowsまたはVisual Studioにアクセスできる場合は、high_resolution_clockを試してみます。(7年前にLinuxに切り替えました。申し訳ありませんが、自分で確認することはできません。) Xeoが書いたように、「high_resolution_clockはMSVCを使用したsystem_clockのtypedefです。」

于 2013-01-21T12:55:37.230 に答える