64位精度的睡眠功能?

时间:2019-02-07 21:04:06

标签: c winapi timer sleep

当前Sleep需要一个DWORD(32位)作为时间。是否有采用DWORDLONG(64位)的替代方案?

我正在使用RNG,其中每增加一个额外的字节,总的等待时间就会增加。使用32位整数时,总时间为5分钟,我想增加它。

3 个答案:

答案 0 :(得分:2)

Sleep[Ex]内部调用NtDelayExecution-未记录,但存在于所有Windows nt版本中(从nt 4到win 10)-由 ntdll.dll 导出-使用 wdk中的ntdll.lib ntdllp.lib 。内核中此调用的结果将称为文档功能KeDelayExecutionThread

//extern "C"
NTSYSAPI 
NTSTATUS
NTAPI
NtDelayExecution(
  IN BOOLEAN              Alertable,
  IN PLARGE_INTEGER       Interval );
  
      
  • 可容忍
  •   
     

指定 TRUE (如果等待可以引起警告)。下层驾驶员应   指定 FALSE

     
      
  • 间隔
  •   
     

以100纳秒为单位指定绝对或相对时间,   为此,将要等待。负值表示相对   时间。绝对到期时间跟踪系统时间的任何变化;   相对到期时间不受系统时间更改的影响。

Sleep[Ex]是Win32 Shell,通过此本机api,限制间隔值(从64到32位)不能设置绝对时间(可能与NtDelayExecution一起使用)并且忽略警报(我们可以从通过警报线程的NtDelayExecution(如果可以等待警报)

因此您可以直接通过Sleep[Ex]间接调用此api

因此Sleep(dwMilliseconds)被称为Sleep(dwMilliseconds, false)

SleepEx(dwMilliseconds, bAlertable) 

致电

LARGE_INTEGER  Interval;
Interval.QuadPart = -(dwMilliseconds * 10000);
NtDelayExecution(bALertable, &Interval);

请注意,如果发生警报警报,可以通过apc(api返回STATUS_USER_APC)或警报(将返回STATUS_ALERTED来中断它。我们可以通过NtAlertThread警报线程)。 SleepEx检查返回的状态,并且在STATUS_ALERTED情况下-再次以更新的间隔开始等待。因此SleepEx的等待不能通过警报(NtAlertThread来打破,但是NtDelayExecution可以

答案 1 :(得分:1)

Sleep()需要毫秒。 DWORD的最大值为4294967295,将导致49.7天的超时时间。在大多数情况下,这是一个足够好的最大值,但是如果确定要使用64位睡眠参数,则可以将多个Sleep()调用链接在一起。这会将Sleep()的最大毫秒数更改为18446744073709551615,这是数十万个世纪的数量级:

VOID WINAPI Sleep64(DWORDLONG dwlMilliseconds)
{
    while (dwlMilliseconds)
    {
        Sleep(min(0xFFFFFFFE, dwlMilliseconds));
        dwlMilliseconds -= min(0xFFFFFFFE, dwlMilliseconds);
    }
}

我已经对此进行了测试,可以验证它是否有效。

答案 2 :(得分:0)

  

是否有采用DWORDLONG(64位)的替代方案?

不。您需要循环调用多个Sleep

有趣的测试和调试多个月睡眠。