2012-03-22 31 views
7

Este es un ejemplo de pgm para verificar la funcionalidad de la función Sleep(). Esta es una demostración solo desde que iam usa las funciones sleep() y clock() en el desarrollo de mi aplicación.Uso de la función 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; 
    } 

en este código estoy calculando el tiempo usando clock() antes y después de la función de reposo. Como iam usando sleep (30000), la diferencia de tiempo sería al menos 30000.

He ejecutado este prgm muchas veces. y salida impresa como 30000, 30001, 30002. Están bien. Pero algunas veces obtengo valores como 29999 y 29997. ¿Cómo es posible? Ya que puse 30000 sleep b/w el reloj().

Por favor, dame la razón de esto.

Respuesta

5

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

El sistema de reloj "ticks" a una velocidad constante. Si dwMilliseconds es menor que la resolución del reloj del sistema, el hilo puede dormir por un tiempo inferior al especificado. Si dwMilliseconds es mayor que un tick pero menor que dos, la espera puede estar entre uno y dos tics, y así sucesivamente.

Simplemente significa que la función Sleep nunca dormirá exactamente durante el tiempo otorgado, pero lo más cerca posible de la resolución del planificador.

La misma página le ofrece un método para aumentar la resolución del temporizador si realmente lo necesita.

También hay high resolution timers que pueden ajustarse mejor a sus necesidades.

+0

muchas gracias por sus valiosos comentarios. –

+0

También encontré que la función clock() funciona en función de las marcas de reloj del proceso. Pero el sueño() pertenece solo VS ... ¿verdad? –

+0

clock pertenece a la biblioteca estándar C, mientras que Sleep es una función API de Windows. En sistemas GNU, el equivalente sería nanosleep. – SirDarius

2

A menos que esté utilizando un sistema operativo en tiempo real, eso es muy esperado.

El sistema operativo tiene que programar y ejecutar muchos otros procesos, por lo que es posible que el despertar del suyo no coincida con la hora exacta en que deseaba dormir.

1

La función clock() indica cuánto tiempo de procesador ha utilizado el proceso de llamada.

Puede reemplazar el uso del reloj() por la función GetSystemTimeAsFileTime para medir la hora con mayor precisión.

También puede intentar utilizar timeBeginPeriod con wPeriodMin devuelto por una llamada al timeGetDevCaps para obtener la frecuencia máxima de interrupción.

Para sincronizar las caídas con el período de interrupción del sistema, también sugeriría que duerma (1) antes de la primera "captura de tiempo".

Al hacerlo, los "demasiado cortos" desaparecerán.

Más información abount sueño se puede encontrar 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

Aunque quizás sea útil, esto no responde la pregunta que se hizo. – AndyPerfect

+0

realmente, gracias a ti; :) –