2009-05-21 8 views
11

जब मैं एक गैर संकेत घटना WaitForSingleObject समारोह का उपयोग करने पर इंतजार के समय समाप्त संकल्प, मुझे लगता है कि कुछ मामलों में कॉल निर्दिष्ट समय अवधि से कम समय में WAIT_TIMEOUT वापस आ जाएगी। बस 1000 एमएमएस पर सेटआउट के साथ कॉल पर लूपिंग, मैंने 9 0 9एमएस (WinXP पर चल रहे) के रूप में कम अवधि में कॉल रिटर्न देखा है। मैं सिस्टम घड़ी घड़ी स्वतंत्र समय माप प्राप्त करने के लिए क्वेरीरीफॉर्मेंस काउंटर का उपयोग कर रहा हूं, इसलिए मुझे नहीं लगता कि घड़ी की बहाव का जवाब होने की संभावना है।WaitForSingleObject

यह व्यवहार मेरे लिए किसी भी व्यावहारिक समस्याओं प्रस्तुत नहीं करता है, लेकिन मैं इसे बेहतर समझने के लिए चाहते हैं। ऐसा लगता है कि यह लगभग टाइमर टिक के संकल्प पर काम कर रहा है। क्या माइक्रोसॉफ्ट इस समारोह की परिशुद्धता पर कोई और विवरण प्रकाशित करता है? क्या मुझे Vista में अधिक सटीकता की उम्मीद करनी चाहिए?

+0

मैं एक छोटा परीक्षण सुझा सकता हूं: बस प्रतीक्षा समारोह से पहले 'नींद (0)' रखें। यह आपकी उम्मीदों को पूरा करने के लिए व्यवहार को बदलने की संभावना है। इसके अलावा: 'QueryPerformanceCounter() 'के मूल्यों को' QueryPerformanceFrequency() 'द्वारा लौटाई गई आवृत्ति का उपयोग करके समय मूल्यों में कनवर्ट करने का तात्पर्य है कि आवृत्ति सटीक है। दी गई आवृत्ति को स्थिर के रूप में माना जाता है। लेकिन अन्तर्निहित हार्डवेयर सहनशीलता है। आवृत्ति हमेशा एक ऑफसेट और संभवतः थर्मल बहाव भी है। – Arno

उत्तर

8

हाँ, WaitForSingleObject घड़ी टिक संकल्प का उपयोग करता है, यह QueryPerformanceCounter की तरह एक उच्च संकल्प टाइमर का उपयोग नहीं करता है।

http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx, "कार्य प्रतीक्षा करें" पर MSDN लेख इस पर फैलता:

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

यह आलेख यह भी बताता है कि सिस्टम घड़ी रिज़ॉल्यूशन बढ़ाने के लिए TimeBeginPeriod का उपयोग कैसे करें - लेकिन इसकी अनुशंसा नहीं की जाती है।

मैं कई कारण के बारे में सोच सकते हैं। सबसे पहले, WaitForSingleObject के लगभग सभी उपयोग मामलों के लिए एक उच्च रिज़ॉल्यूशन की आवश्यकता नहीं है। एक उच्च-रिज़ॉल्यूशन टाइमर का उपयोग करने के लिए कर्नेल को टाइमर को लगातार मतदान करने की आवश्यकता होगी (कर्नेल कोड हमेशा चलने की गारंटी नहीं है) या एक इंटरप्ट उत्पन्न करने के लिए इसे अक्सर पुन: प्रोग्राम करें (क्योंकि कई WaitForSingleObjects हो सकते हैं और संभवतः केवल एक ही प्रोग्राम करने योग्य बाधा)।

दूसरी ओर, पहले से ही एक समय स्रोत है जो एक संकल्प पर लगातार अद्यतन करने योग्य है जो WaitForSingleObject, SetWaitableTimer, और नींद के लिए पर्याप्त से अधिक है।

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