代码之家  ›  专栏  ›  技术社区  ›  AnArrayOfFunctions

64位精度休眠功能?

  •  -2
  • AnArrayOfFunctions  · 技术社区  · 5 年前

    目前 Sleep 使用单个双字(32位)作为时间。是否有其他选择采用dwordlong(64位)?

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

    3 回复  |  直到 5 年前
        1
  •  2
  •   RbMm    5 年前

    Sleep[Ex] 内部调用 NtDelayExecution -未记录但存在于所有Windows NT版本中(从NT 4到Win 10)-由导出 NDLL.DLL -使用 美国国际广播电台 NTDLLP.LIB 来自WDK。因此,内核中的调用将被称为文档化函数。 KeDelayExecutionThread

    //extern "C"
    NTSYSAPI 
    NTSTATUS
    NTAPI
    NtDelayExecution(
      IN BOOLEAN              Alertable,
      IN PLARGE_INTEGER       Interval );
    
    • 告警状态

    指定 真的 如果等待有警报。低级驾驶人应该 指定 错误的 .

    • 间隔

    以100纳秒为单位指定绝对或相对时间, 等待就会发生。负值表示相对 时间。绝对失效时间跟踪系统时间的任何变化; 相对过期时间不受系统时间更改的影响。

    睡[睡] 是win32 shell,在此本机API上,它限制间隔值(从64位到32位)不能设置绝对时间(可能使用 NTDelayExecution(NTDelayExecution) )忽略警报(如果wait alertable,我们可以通过警报线程退出ntdelayexecution)

    所以您可以直接调用这个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 检查返回状态,以防 状态警报 -再次以更新的间隔开始等待。所以 梦游 不能通过警报中断等待( 纳塔尔螺纹 但是 NTDelayExecution(NTDelayExecution) 可以

        2
  •  1
  •   Remy Lebeau    5 年前

    Sleep() 需要毫秒。最大值 DWORD 值4294967295将导致49.7天的超时。在大多数情况下,这是一个足够好的最大值,但是如果您决定要有一个64位的sleep参数,那么您可以链接多个 睡眠() 一起通话:

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

    我测试过这个,它起作用了。

        3
  •  0
  •   David Heffernan    5 年前

    是否有其他选择采用dwordlong(64位)?

    不,您需要多个电话 Sleep ,在一个循环中。

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