2012-03-22 59 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; 
    } 

在這段代碼我正在計算使用clock()函數前後的時間。 由於iam使用睡眠(30000),時間差將至少爲30000.

我已經運行此prgm多次。並打印輸出爲30000,30001,30002。這些都沒問題。但有些時候,我得到的值是29999和29997.如何這可能,因爲我把30000睡眠b/w時鐘()。

請給我原因。

回答

5

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

系統時鐘 「滴答」 以恆定的速率。如果dwMilliseconds小於系統時鐘的分辨率,則線程可能會睡眠時間小於指定的時間長度。如果dwMilliseconds大於一個小數點但小於兩個,則等待可以是一到兩個滴答聲之間的任何地方,依此類推。

這只是意味着睡眠功能永遠不會準確睡眠給定的時間量,但儘可能接近調度程序的分辨率。

同一頁面爲您提供了一種方法來增加計時器分辨率,如果您真的需要它。

還有high resolution timers可能更適合您的需求。

+0

非常感謝您的寶貴意見。 – 2012-03-22 15:33:42

+0

我還發現clock()函數基於進程時鐘滴答。但睡眠()只屬於VS ..正確? – 2012-03-23 06:27:01

+0

時鐘屬於C標準庫,而Sleep是Windows API函數。在GNU系統上,相當於納睡。 – SirDarius 2012-03-23 09:17:04

2

除非你使用的是實時操作系統,這是非常期待的。

操作系統必須安排和運行許多其他進程,因此喚醒您的啓動可能與您想要睡覺的確切時間不匹配。

1

clock()函數告訴調用進程使用了​​多少處理器時間。

您可以使用函數GetSystemTimeAsFileTime 替換clock()的使用,以便更準確地測量時間。

另外,您也可以嘗試使用timeBeginPeriod,並通過調用timeGetDevCaps返回wPeriodMin以獲得最大中斷頻率。

爲了使睡眠與系統中斷週期同步,我還建議 在第一次「時間捕捉」之前有睡眠(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 2013-08-22 16:39:59

+0

真的,謝謝你; :) – 2017-02-07 20:33:24