दिलचस्प पोस्ट
संदर्भों के सरणी अवैध क्यों हैं? कैसे जल्दी से एक जावास्क्रिप्ट वस्तु को साफ करने के लिए? 1052: फ़ील्ड सूची में कॉलम 'आईडी' अस्पष्ट है कॉम्बो बॉक्स- चयन चेंजेड ईवेंट का पुराना मान है, न कि नया मान OpenSSL API का उपयोग करके प्रमाण पत्र श्रृंखला को प्रोग्राम की पुष्टि करें जेपीजी छवि को जीआईएफ, पीएनजी और बीएमपी स्वरूप में परिवर्तित करें किसी वेब पेज पर एक HTML तालिका के रूप में गतिशील रूप से एक CSV फ़ाइल प्रदर्शित करें किसी .NET कंसोल से JSON WebService को कॉल करने का सर्वोत्तम तरीका मिनटों में दो Joda-Time DateTimes के बीच अंतर कैसे प्राप्त करें इन-ऐप खरीद "सबमिट करने के लिए तैयार", लेकिन मुझे इसे सबमिट नहीं करने देंगे बिटमैप में स्वीकार्य विधि में GDI + में सामान्य त्रुटि आई Jquery – बच्चों के अंदरूनी एचएलएल द्वारा दिये गये डीआईवी जावा कुंजीलिस्टर एरो कुंजियों को दर्ज नहीं कर रहा है सिमेंटिक डिफ उपयोगिताओं पृष्ठ पर स्क्रॉल सक्रिय मेनू आइटम बदलें?

QueryPerformanceCounter का उपयोग कैसे करें?

मैंने हाल ही में तय किया है कि मुझे अपने टाइमर वर्ग के लिए मिलीसेकेंड का उपयोग करने के लिए माइक्रोसॉन्ड्स से बदलने की जरूरत है, और कुछ शोध के बाद मैंने यह निर्णय लिया है कि क्वेरीपरफेन्सन क्वॉर्टर शायद मेरा सबसे सुरक्षित शर्त है ( Boost::Posix पर चेतावनी Boost::Posix कि यह Win32 एपीआई पर काम नहीं कर सकता मुझे थोड़ी दूर डाल दिया) हालांकि, मुझे वाकई यकीन नहीं है कि इसे कैसे कार्यान्वित करें

मैं जो कुछ कर रहा हूं जो GetTicks() एस्क फ़ंक्शन को बुला रहा है मैं उपयोग कर रहा हूं और इसे टाइमर के startingTicks GetTicks() चर में निर्दिष्ट कर रहा हूं। फिर समय बीतने की मात्रा को खोजने के लिए मैं सिर्फ startTicks से फ़ंक्शन का रिटर्न वैल्यू घटाना चाहता हूं, और जब मैं टाइमर रीसेट करता हूँ, तो मैं फ़ंक्शन फिर से कॉल करता हूँ और इसे शुरु करने के लिए टाईक्स देता है। दुर्भाग्य से, मैंने जो कोड देख लिया है, वह उतना आसान नहीं है जितना कि QueryPerformanceCounter() कहता है, और मुझे यकीन नहीं है कि मुझे इसके तर्क के रूप में क्या देना चाहिए।

Solutions Collecting From Web of "QueryPerformanceCounter का उपयोग कैसे करें?"

 #include <windows.h> double PCFreq = 0.0; __int64 CounterStart = 0; void StartCounter() { LARGE_INTEGER li; if(!QueryPerformanceFrequency(&li)) cout << "QueryPerformanceFrequency failed!\n"; PCFreq = double(li.QuadPart)/1000.0; QueryPerformanceCounter(&li); CounterStart = li.QuadPart; } double GetCounter() { LARGE_INTEGER li; QueryPerformanceCounter(&li); return double(li.QuadPart-CounterStart)/PCFreq; } int main() { StartCounter(); Sleep(1000); cout << GetCounter() <<"\n"; return 0; } 

इस प्रोग्राम को आउटपुट एक नंबर करीब 1000 (विंडोज़ नींद सही नहीं है, लेकिन यह 999 जैसा होना चाहिए) होना चाहिए।

StartCounter() फ़ंक्शन CounterStart चर में कार्यक्षमता काउंटर पर टिक की संख्या रिकॉर्ड करता है GetCounter() फ़ंक्शन मिलीसेकंड की संख्या देता है क्योंकि StartCounter() को अंतिम रूप से डबल कहा जाता था, इसलिए यदि GetCounter() 0.001 प्राप्त करता है, तो इसके बारे में 1 माइक्रोसॉंड होता है क्योंकि StartCounter() को बुलाया गया था।

यदि आप टाइमर का इस्तेमाल करना चाहते हैं, तो इसके बदले में बदलाव करें

 PCFreq = double(li.QuadPart)/1000.0; 

सेवा मेरे

 PCFreq = double(li.QuadPart); 

या यदि आप चाहते हैं कि माइक्रोसेकेंड तब उपयोग करें

 PCFreq = double(li.QuadPart)/1000000.0; 

लेकिन वास्तव में यह सुविधा के बारे में है, क्योंकि यह एक डबल देता है

मैं ये परिभाषित करता हूं:

 /** Use to init the clock */ #define TIMER_INIT \ LARGE_INTEGER frequency; \ LARGE_INTEGER t1,t2; \ double elapsedTime; \ QueryPerformanceFrequency(&frequency); /** Use to start the performance timer */ #define TIMER_START QueryPerformanceCounter(&t1); /** Use to stop the performance timer and output the result to the standard stream. Less verbose than \c TIMER_STOP_VERBOSE */ #define TIMER_STOP \ QueryPerformanceCounter(&t2); \ elapsedTime=(float)(t2.QuadPart-t1.QuadPart)/frequency.QuadPart; \ std::wcout<<elapsedTime<<L" sec"<<endl; 

उपयोग (पुन: परिभाषा को रोकने के लिए कोष्ठक):

 TIMER_INIT { TIMER_START Sleep(1000); TIMER_STOP } { TIMER_START Sleep(1234); TIMER_STOP } 

उपयोग के उदाहरण से आउटपुट:

 1.00003 sec 1.23407 sec 

यह मानते हुए कि आप Windows पर हैं (यदि ऐसा है तो आपको अपने प्रश्न को इस तरह से टैग करना चाहिए!), इस MSDN पृष्ठ पर आप एक सरल, उपयोगी HRTimer सी ++ क्लास के लिए स्रोत ढूंढ सकते हैं जो आपको आवश्यक सिस्टम कॉल को पूरा करने के लिए बहुत कुछ करना चाहता है आवश्यकता होती है (इसे GetTicks() विधि को जोड़ना आसान होगा, विशेष रूप से, जो वास्तव में आप की आवश्यकता होती है)।

गैर-विंडोज प्लेटफॉर्म्स पर, कोई प्रश्नप्ररूपता संपर्क समारोह नहीं है, इसलिए समाधान सीधे पोर्टेबल नहीं होगा। हालांकि, अगर आप इसे ऊपर बताए गए HRTimer रूप में किसी वर्ग में HRTimer , तो मौजूदा प्लेटफॉर्म को वास्तव में प्रदान करने के लिए क्लास के कार्यान्वयन को बदलना आसान होगा (शायद बूस्ट या जो भी हो!)

मैं इस प्रश्न को एनडीआईएस ड्राइवर उदाहरण के साथ समय पर प्राप्त कर सकता हूं। जैसा कि कोई जानता है, किकेसीसिस्टम टाइम (NdisGetCurrentSystemTime के तहत नकल) मिलीसेकेंड से कम रिज़ॉल्यूशन होता है, और कुछ नेटवर्क प्रोसेसर या अन्य आईआरपी जैसे प्रक्रियाएं हैं जिन्हें बेहतर टाइमस्टैम्प की आवश्यकता हो सकती है;

उदाहरण बस उतना सरल है:

 LONG_INTEGER data, frequency; LONGLONG diff; data = KeQueryPerformanceCounter((LARGE_INTEGER *)&frequency) diff = data.QuadPart / (Frequency.QuadPart/$divisor) 

जहां विभाजक 10 ^ 3 या 10 ^ 6 आवश्यक संकल्प के आधार पर होता है