计时器坏了或者其他什么的



我有一些程序必须帮助我,但我无法处理计时
雇佣是一个代码:

#include <iostream>
using namespace std;
#include <time.h>
#include <Windows.h>
double diffclock(clock_t clock1) {
clock_t clock2 = clock();
double diffticks = clock1 - clock2;
double diffms = diffticks / (CLOCKS_PER_SEC / 1000);
return diffms;
}

int main()
{
int wait = 134;
clock_t fullbetween = clock();
for (int i = 0; i < 5; i++) {
Sleep(wait / 5);
cout << wait / 5 << "  ";
}
cout << endl << "finish in " << diffclock(fullbetween) << " ms" << endl;
return 0;
}

C++版本。相同的结果:

#include <iostream>
#include <chrono>
#include <ctime>
#include <thread>
#include <Windows.h>

int main()
{
int wait = 134;
auto start = std::chrono::system_clock::now();
for (int i = 0; i < 5; i++) {
std::this_thread::sleep_for(std::chrono::milliseconds(wait/5));
}
auto end = std::chrono::system_clock::now();
auto int_ms = std::chrono::duration_cast<std::chrono::milliseconds> (end - start);
std::cout << std::endl << "finish in " << int_ms.count() << " ms" << std::endl;
return 0;
}

134/5=26是可以的。但在最后的"cout"中,它表明所有的迭代花费了大约170ms,而不是预期的130。为什么会发生这种情况?

对不起我的英语。

https://learn.microsoft.com/en-gb/windows/win32/api/synchapi/nf-synchapi-sleep表示

暂停当前线程的执行,直到超时间隔过去。

系统时钟";ticks";以恒定的速率。如果dwMilliseconds小于系统时钟的分辨率,则线程的睡眠时间可能小于指定的时间长度。如果dwMilliseconds大于一个刻度但小于两个刻度,则等待可以在一到两个刻度之间,依此类推

在Windows系统上,刻度通常为15.6毫秒(每秒64个刻度(,因此26变为31.2。这是挂起的线程可能再次变为活动的时间,不能保证它会立即开始执行。所以你的五次睡眠变成了156毫秒加上一点开销。

文件中继续介绍了这种行为的缓解措施,以及缓解措施将影响系统功率使用的警告等

要提高睡眠间隔的准确性,请调用timeGetDevCaps函数来确定支持的最小计时器分辨率,并调用timeBeginPeriod函数来将计时器分辨率设置为最小值。

在std::this_thread::sleep_for文档中(在此处找到(

声明该函数阻止当前至少指定sleep_duration的线程。

它可能会阻塞由于日程安排或资源争用而超过sleep_duration延迟。

因此,您的代码至少需要135毫秒才能执行。

最新更新