2012-03-22 2 views
7

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

// 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; 
    } 

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

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

Пожалуйста, объясните причину этого.

ответ

5

По http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx:

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

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

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

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

+0

Большого спасибо за ценный комментарий. –

+0

Также я обнаружил, что функция clock() работает на основе тактовых импульсов процесса. Но Sleep() принадлежит только VS .. right ??? –

+0

часы принадлежат к стандартной библиотеке C, тогда как Sleep - это функция Windows API. В системах GNU эквивалент будет наноселективным. – SirDarius

2

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

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

1

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

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

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

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

Таким образом, «слишком короткие» исчезнут.

Больше информации abount сна можно найти here

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"; 
} 
+0

Хотя, возможно, полезно, это не отвечает на вопрос, который был задан. – AndyPerfect

+0

действительно, thankYou; :) –