Majjcom 2022-05-29 13:58 采纳率: 33.3%
浏览 65

关于Windows Sleep() 函数的问题

问题遇到的现象和发生背景:

我想调用Windows的Sleep函数,但是实际休眠时间为传入参数的两倍。
有人知道咋回事不

问题相关代码:

if (sleep > 0)
{
    const int sleep_int = (int)(sleep * 1000000.0);
    time_t ttt0 = chrono::duration_cast<chrono::microseconds>(chrono::system_clock::now().time_since_epoch()).count();
    this_thread::sleep_for(chrono::microseconds(sleep_int));  // 这里和调用 ::Sleep() 得到的结果相同
    time_t ddt = chrono::duration_cast<chrono::microseconds>(chrono::system_clock::now().time_since_epoch()).count() - ttt0;
    printf("sleep_int=%d\nddt=%I64d\n", sleep_int, ddt);
}

运行结果:

运行结过中,ddt 大约为 sleep_int 的两倍

dt=0.019504 count=2
sleep_int=15808
ddt=29065
dt=0.030148 count=3
sleep_int=14284
ddt=28233
dt=0.030710 count=4
sleep_int=14914
ddt=28899
dt=0.030949 count=5
sleep_int=13108
ddt=27947
dt=0.031663 count=6
sleep_int=13926
ddt=27891
dt=0.030904 count=7
sleep_int=15415
ddt=29988
dt=0.031418 count=8
sleep_int=14810
ddt=29431
我的解答思路和尝试过的方法

现在的解决方法是把sleep_int除以2,但是这个问题本身出在什么地方就不知道了。
希望有人能解答

  • 写回答

1条回答 默认 最新

  • 冰山76 2022-05-30 15:41
    关注

    time_t ttt0 = chrono::duration_castchrono::microseconds(chrono::system_clock::now().time_since_epoch()).count();
    this_thread::sleep_for(chrono::microseconds(sleep_int)); // 这里和调用 ::Sleep() 得到的结果相同 这一行是你需要的,暂时去掉
    time_t ddt = chrono::duration_castchrono::microseconds(chrono::system_clock::now().time_since_epoch()).count() - ttt0;
    这三行代码,去掉中间一行测试一下直接运算这两个计算结果之间的差值是多少,理论上这个数值是在一定范围内变动,你所需的休眠时间越长,这个数对你的结果影响越小,休眠时间越短,影响越大,出现两倍的原因应该刚好是你所需的这行执行时间与去掉这行的执行时间大体相同导致的
    Windows是一个分时操作系统,CPU给当前进程分配的时间片大小、数量也是影响因素

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月29日
  • 修改了问题 5月29日
  • 创建了问题 5月29日

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题