Использование функции Sleep () - PullRequest
7 голосов
/ 22 марта 2012

Это образец pgm для проверки функциональности функции Sleep (). Это только демонстрационная версия, поскольку я использую функции sleep () и clock () в моем приложении.

  // TestTicks.cpp : Defines the entry point for the console application.
  //

  #include "stdafx.h"
  #include<iostream>
  #include<iomanip>
  #include <Windows.h>

  int _tmain(int argc, _TCHAR* argv[])
  {
    int i, i2;
    i = clock();
    //std::cout<<" \nTime before Sleep() : "<<i;
    Sleep(30000);
    i2 = clock();
    //std::cout<<" \nTime After Sleep() : "<<i2;
    std::cout<<"\n Diff : "<<i2 -i;
    getchar();
      return 0;
  }

в этом коде я рассчитываю время с помощью clock () до и после функции сна. Поскольку я использую sleep (30000), разница во времени будет не менее 30000.

Я запускал этот prgm много раз. и напечатанный вывод как 30000, 30001, 30002. Это нормально. Но иногда я получаю значения, такие как 29999 и 29997. Как это возможно, так как я поставил 30000 сна ч / б часы ().

Пожалуйста, дайте мне причину этого.

Ответы [ 4 ]

5 голосов
/ 22 марта 2012

Согласно http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx:

Системные часы «тикают» с постоянной скоростью.Если dwMilliseconds меньше, чем разрешение системных часов, поток может находиться в спящем режиме меньше указанного промежутка времени.Если dwMilliseconds больше одного тика, но меньше двух, ожидание может быть где-то между одним и двумя тиками и т. Д.

Это просто означает, что функция Sleep никогда не будет спать ровно на всю суммууказанного времени, но как можно ближе к разрешению планировщика.

На этой же странице вы найдете способ увеличить разрешение таймера, если оно вам действительно нужно.

Также есть таймеры высокого разрешения , которые могут лучше соответствовать вашим потребностям.

3 голосов
/ 22 марта 2012

Если вы не используете ОС реального времени, это очень ожидаемо.

Операционная система должна планировать и запускать многие другие процессы, поэтому пробуждение может не соответствовать точному времени, когда вы хотели спать.

1 голос
/ 13 июля 2012

Функция clock () сообщает, сколько процессорного времени использовало вызывающий процесс.

Вы можете заменить использование clock () функцией GetSystemTimeAsFileTime для более точного измерения времени.

Также вы можете попробовать использовать timeBeginPeriod с wPeriodMin, возвращаемым при вызове timeGetDevCaps , чтобы получить максимальную частоту прерывания.

Чтобы синхронизировать сны с периодом системного прерывания, я бы также предложил чтобы поспать (1) перед первым «захватом времени».

При этом «слишком короткие шорты» исчезнут.

Более подробную информацию о сне можно найти здесь

0 голосов
/ 22 августа 2013
#include <iostream> 
#include <time.h>  

void wait(int seconds) 
{ 
    int endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC ; 
    while (clock() < endwait){} 
} 

int main() 
{ 
    wait(2);
    cout<<"2 seconds have passed";
}
...