Использование функции Sleep()

это образец pgm для проверки функциональности функции Sleep ().Это демонстрация только с тех пор, как iam использует эти функции 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 () до и после функции сна. Поскольку iam использует sleep (30000), разница во времени будет по крайней мере 30000.

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

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

4 ответов


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

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

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

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

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


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

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


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

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

также вы можете попробовать использовать timeBeginPeriod С wperiodmin возвращается вызовом timeGetDevCaps для того чтобы obtail максимальная частота прерывания.

для синхронизации спит с периодом прерывания системы, я бы также предложил иметь сон (1) перед первым "захватом времени".

таким образом, "слишком шорты" исчезнет.

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


#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";
}