gpt4 book ai didi

c++ - 使用 sleep_for 每毫秒运行一次循环

转载 作者:行者123 更新时间:2023-11-30 01:46:41 25 4
gpt4 key购买 nike

我想在线程内运行一个循环,每毫秒计算一些数据。但是我在 sleep 功能上遇到了麻烦。它睡得太久了。

我在 visual studio 中创建了一个基本的控制台应用程序:

#include <windows.h>
#include <iostream>
#include <chrono>
#include <thread>

using namespace std;
typedef std::chrono::high_resolution_clock Clock;

int _tmain(int argc, _TCHAR* argv[])
{
int iIdx = 0;
bool bRun = true;

auto aTimeStart = Clock::now();

while (bRun){
iIdx++;
if (iIdx >= 500) bRun = false;

//Sleep(1);
this_thread::sleep_for(chrono::microseconds(10));
}

printf("Duration: %i ms\n", chrono::duration_cast<std::chrono::milliseconds>(Clock::now() - aTimeStart).count());

cin.get();

return 0;
}

打印出来:Duration: 5000 ms当我使用 Sleep(1) 时打印出相同的结果;

我希望持续时间为 500 毫秒,而不是 5000 毫秒。我在这里做错了什么?

更新:


我使用的是 Visual Studio 2013。现在我已经安装了 Visual Studio 2015,它的打印结果很好:持续时间:500 毫秒(有时是 527 毫秒)。

但是,这个 sleep_for 仍然不是很准确,所以我会寻找其他解决方案。

最佳答案

流行操作系统使用的典型时间片远大于 1 毫秒(比如 20 毫秒左右); sleep 设置了您希望线程暂停的时间的最小值,而不是最大值。一旦您的线程变得可运行,就由操作系统决定下一次调度它的时间。

如果你需要这种级别的准确性,你要么需要一个实时操作系统,要么在你的线程上设置一个非常高的优先级(这样它几乎可以抢占任何其他东西),或者在内核中编写你的代码,或者使用一个忙等等。

但是你真的需要每毫秒计算一次吗?这种时序要求通常来自硬件。如果稍后将计算集中在一起,会出现什么问题?

关于c++ - 使用 sleep_for 每毫秒运行一次循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32796136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com