2012-03-22 12 views
7

यह स्लीप() फ़ंक्शन की कार्यक्षमता की जांच करने के लिए एक नमूना पीजीएम है। यह केवल मेरे डेमो विकास में इस नींद() और घड़ी() फ़ंक्शंस का उपयोग करके डेमो है।नींद() फ़ंक्शन उपयोग

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

इस कोड में मैं नींद समारोह से पहले और बाद में घड़ी() का उपयोग कर समय की गणना कर रहा हूं। चूंकि नींद (30000) का उपयोग करते हुए, समय अंतर भिन्न 30000 होगा।

मैंने कई बार इस prgm को चलाया है। और 30000, 30001, 30002 के रूप में मुद्रित आउटपुट। ये ठीक हैं। लेकिन कुछ बार मुझे 2 9 99 9 और 2 9 99 7 जैसे मूल्य मिल रहे हैं। यह कैसे संभव है, क्योंकि मैंने 30000 नींद बी/डब्ल्यू घड़ी() डाल दी है।

कृपया मुझे इसके लिए कारण दें।

उत्तर

5

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx के अनुसार:

सिस्टम घड़ी एक निरंतर दर पर "टिक्स"। यदि dwMilliseconds सिस्टम घड़ी के संकल्प से कम है, तो थ्रेड निर्दिष्ट समय की तुलना में कम के लिए सो सकता है। यदि dwMilliseconds एक टिक से अधिक है लेकिन दो से कम है, तो प्रतीक्षा एक और दो टिकों के बीच कहीं भी हो सकती है, और इसी तरह।

यह सिर्फ इतना है कि नींद समारोह समय की मात्रा को देखते हुए के लिए वास्तव में कभी निष्क्रिय नहीं होगी, लेकिन अधिक से अधिक निकट अनुसूचक के संकल्प को देखते हुए का मतलब है।

एक ही पृष्ठ आपको टाइमर रिज़ॉल्यूशन बढ़ाने की विधि देता है यदि आपको वास्तव में इसकी आवश्यकता है।

high resolution timers भी हैं जो आपकी आवश्यकताओं के अनुरूप बेहतर हो सकते हैं।

+0

आप अपने बहुमूल्य टिप्पणी के लिए बहुत बहुत धन्यवाद। –

+0

इसके अलावा मैंने पाया कि घड़ी() फ़ंक्शन प्रक्रिया घड़ी की टिकों के आधार पर काम करता है। लेकिन नींद() केवल वीएस से संबंधित है .. सही ??? –

+0

घड़ी सी मानक लाइब्रेरी से संबंधित है, जबकि स्लीप एक विंडोज एपीआई फ़ंक्शन है। जीएनयू सिस्टम पर, बराबर नैनोस्ली होगी। – SirDarius

2

जब तक कि आप रीयलटाइम ओएस का उपयोग नहीं कर रहे हैं, तो इसकी बहुत उम्मीद है।

ऑपरेटिंग सिस्टम को कई अन्य प्रक्रियाओं को शेड्यूल करना और चलाने की ज़रूरत है, इसलिए आपका उठना सटीक समय से मेल नहीं खा सकता है।

1

clock() फ़ंक्शन बताता है कि कॉलिंग प्रक्रिया का कितना प्रोसेसर समय उपयोग किया गया है।

समय को अधिक सटीक रूप से मापने के लिए आप GetSystemTimeAsFileTime फ़ंक्शन द्वारा घड़ी() के उपयोग को प्रतिस्थापित कर सकते हैं।

इसके अलावा, आप अधिकतम व्यवधान आवृत्ति obtail में timeGetDevCaps के लिए एक कॉल द्वारा दिया wPeriodMin साथ timeBeginPeriod इस्तेमाल करने की कोशिश कर सकते हैं।

सिस्टम इंटरप्ट अवधि के साथ नींद को सिंक्रनाइज़ करने के लिए, मैं पहले "टाइम कैप्चर" से पहले नींद (1) से पहले का भी सुझाव दूंगा।

ऐसा करके, "बहुत शॉर्ट्स" गायब हो जाएंगे। नींद करने के बारे में

अधिक जानकारी पाया जा सकता है 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

वास्तव में, धन्यवाद; :) –

संबंधित मुद्दे