プロが教える店舗&オフィスのセキュリティ対策術

ミリ秒単位で処理を止められる Sleep関数を使ってみたのですが、
時間誤差が、最大で18ms もあり、使い物になりません。
win10で、1ms精度での待ち時間の設定の方法ありますか?

---- 動作確認プログラム ----
#include <windows.h>
#include <stdio.h>

for(j=14; j<48; j++) {
 t0 = timeGetTime();
 Sleep(j);
 dt = timeGetTime() - t0 - j; // 本来なら0になるはず
 printf("%d ",dt);
}

の結果が以下の通り、
18 6 6 3 14 13 11 15 10 8 14 6 5 11 3 2 7 1 15 5 13 2 11 16 9 14 7 13 5 10 3 8 1 7

Unixであれば、マイクロ秒単位で処理を止められる usleep関数 があるようですが、Win10では使えません。

A 回答 (6件)

分解能を設定します。



#include <time.h>

timeBeginPeriod(1);



timeEndPeriod(1);
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
(プリエンプティブマルチタスクOSなので途中でたまにおかしくなることもありそうですが、ほとんどの場合)
時間誤差が、最大で1msとなり、希望した動作になりました!

助かりました

お礼日時:2023/02/15 18:16

No.5です。


既出ですみません。

こちらを試してください。

プロジェクトはコンソールアプリ
#include "stdafx.h"

#include <stdio.h>
にする

こちらで10usec単位で設定できます。
https://qiita.com/tobira-code/items/ae0764634f07 …
    • good
    • 0
この回答へのお礼

再度の応答ありがとうございます。

PerformanceCounter 高精度のタイムスタンプ
Waitable Timer 100nsec単位で待ち時間を指定

ですね。参考にさせていただきます。

お礼日時:2023/02/15 18:22

SetTimer で、タイマーイベント 1ms で作って、


自力でカウントすればどうでしょうか?

SetTimer 自体は最初動作するまで時間がかかったと記憶してます。
    • good
    • 0
この回答へのお礼

応答ありがとうございます
SetTimer ですね。参考にさせていただきます!

お礼日時:2023/02/15 11:45
    • good
    • 0
この回答へのお礼

再度の応答ありがとうございます。

WindowsはプリエンプティブマルチタスクOSなので、しょせん無理な話ということですね。

お礼日時:2023/02/15 11:44

usleepは高精度でスリープできる事を保証する訳ではないですけどね。


Unixのタイマの実装は様々。

windowsではTimeBeginPeriodでプロセスのタイマ精度を変更出来る。
1 msは多分無理。そういうのはリアルタイムOSの領分。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
>1 msは多分無理。
>そういうのはリアルタイムOSの領分。
やっぱ、そうなんですかね。

Win10でなら、
 timeGetTime() で時刻をモニタリングして
 設定時刻までCPUの無駄使いしながら待つ
しか方法はないのでしょうかね。

お礼日時:2023/02/14 23:21

https://learn.microsoft.com/ja-jp/windows/win32/ …
みたいなこと?

「μs 単位で指定できる」からといって「μs 単位で制御できる」ことは意味しないけど.
    • good
    • 0
この回答へのお礼

応答ありがとうございます。

>「μs 単位で指定できる」からといって「μs 単位で制御できる」ことは意味しないけど.
今回の質問も、Sleep() がms単位で指定できるが、制御できないので質問しているわけですので、当然、承知しています。

で、
 win10で、1ms精度での待ち時間の設定の方法
ご存じならご教示お願いします

最悪、
t0 = timeGetTime() + dt;
while(t=timeGetTime() < t0)
;
で時間待ちするしかないのかしらとも思っています。

お礼日時:2023/02/14 22:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A