Странности в определении простоя CPU

Тема в разделе "WASM.WIN32", создана пользователем HCode, 29 окт 2008.

  1. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
    Здравствуйте!

    В нижеследующем коде наблюдаю страное значения возвращаемые функцией - NtQuerySystemInformation:

    Код (Text):
    1. type
    2.   SYSTEM_PROCESSOR_TIMES = record
    3.     IdleTime,
    4.     KernelTime,
    5.     UserTime,
    6.     DpcTime,
    7.     InterruptTime: Int64;
    8.     InterruptCount: Cardinal;
    9.   end;
    10.  
    11. var
    12.  TimesStart, TimesEnd: SYSTEM_PROCESSOR_TIMES;
    13.  
    14. NtQuerySystemInformation(8, TimesStart, SizeOf(SYSTEM_PROCESSOR_TIMES), nil);
    15. Sleep(1000);
    16. NtQuerySystemInformation(8, TimesEnd, SizeOf(SYSTEM_PROCESSOR_TIMES), nil);
    Иногда, по не понятным для меня причинам, значение:

    (TimesEnd.IdleTime - TimesStart.IdleTime) = 10140065, хотя при sleep(1000) оно не может быть больше чем 10000000!

    Разница (дельта) между TimesEnd и TimesStart при этой странной ошибке выглядит так:

    IdleTime = 10140065
    KernelTime = 10140065
    UserTime = 0
    DpcTime = 0
    InterruptTime = 0
    InterruptCount = 1034

    P.S. Процессор двухядерный (Intel).
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Всё правильно - там единица измерения 100 наносекунд, так что 1000 миллисекунд в sleep, это как раз ~10000000 с погрешностью 1,4% которые для sleep вполне нормальные.
     
  3. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
    Оказывает что:

    PriorityClass:= REALTIME_PRIORITY_CLASS;
    ThreadPriority:= THREAD_PRIORITY_TIME_CRITICAL;
    и
    timeBeginPeriod(1)

    не дает желаемого результата - точность задержки sleep(x).
    Тему можно закрывать.