दिलचस्प पोस्ट
एक और ब्लॉक शुरू करने से पहले दो async ब्लॉक निष्पादित होने तक प्रतीक्षा कर रहा है .NET में उपलब्ध केवल एक पठन-रहित सामान्य शब्दकोश है? django आयात त्रुटि – कोई मॉड्यूल कोर। प्रबंधन नहीं है सॉकेट.आईओ प्रमाणीकरण पोस्टबैक पर, मैं कैसे चेक कर सकता हूं कि पेज_इंट इवेंट में कौन से नियंत्रण कारण पोस्टबैक PHP mkdir: अनुमति अस्वीकृत समस्या एंड्रॉइड स्टेटस बार को स्थायी रूप से छिपाना बिगडीकिल। दिवाइड के दौरान फेंका गया अंकगणितीय अपवाद एक उपयोगकर्ता सत्र को अमान्य कैसे करें जब वह उसी क्रेडेंशियल के साथ दो बार लॉग करता है कार्यक्रम के रूट दृश्य नियंत्रक को परिवर्तित करें एसटीएल सेट से तत्वों को हटाना, जबकि चलना आर में एक उपयोगी डेटा फ्रेम में विभिन्न लंबाई के सदिश की सूची को कैसे परिवर्तित करें? jQuery वैधीकरण प्लगइन – नियम जो कई क्षेत्रों पर लागू होते हैं Linux / proc / id / maps को समझना Google मानचित्र एपीआई वी 3 में केंद्र बिंदु को ऑफसेट कैसे करें

उच्च संकल्प टाइमर

मुझे लगभग 5 मीलसेकंड रिज़ॉल्यूशन वाला टाइमर रखना है लेकिन वर्तमान टाइमर में नेट के बारे में 50ms का एक संकल्प है। मुझे कोई काम समाधान नहीं मिल सका जो उच्च संकल्प टाइमर बनाता है, हालांकि कुछ का दावा है कि आप इसे सी # में कर सकते हैं।

Solutions Collecting From Web of "उच्च संकल्प टाइमर"

सूचना के संबंध में ओपी विशेष रूप से Timer वर्ग के बारे में पूछ रहा था जो नियमित अंतराल पर घटनाओं को सक्रिय करता है। मैंने इस उत्तर में संशोधन किया है, क्षैतिज नियम के नीचे मेरे पुराने उत्तर के साथ।

मैंने टाइमर क्लास के साथ निम्नलिखित कोड का परीक्षण किया और ऐसा लगता है कि यह मेरी मशीन पर 14-15 मिलीसेकेंड रेंज के भीतर कम से कम प्राप्त कर सकता है। इसे खुद के लिए आज़माएं और देखें कि क्या आप इसे पुन: पेश कर सकते हैं। तो उप -50 मिलिसेकंड प्रतिक्रिया समय संभव है, लेकिन यह ठीक एक मिलीसेकेंड तक नहीं उतर सकता है।

 using System; using System.Timers; using System.Diagnostics; public static class Test { public static void Main(String[] args) { Timer timer = new Timer(); timer.Interval = 1; timer.Enabled = true; Stopwatch sw = Stopwatch.StartNew(); long start = 0; long end = sw.ElapsedMilliseconds; timer.Elapsed += (o, e) => { start = end; end = sw.ElapsedMilliseconds; Console.WriteLine("{0} milliseconds passed", end - start); }; Console.ReadLine(); } } 

NB: निम्नलिखित मेरा पुराना उत्तर है, जब मैंने सोचा कि ओपी समय की बातों के बारे में बात कर रहा था। निम्नलिखित चीजों की अवधि के संबंध में केवल उपयोगी जानकारी है, लेकिन नियमित अंतराल पर किसी भी प्रकार के फायरिंग कार्यक्रम नहीं प्रदान करता है। उस उद्देश्य के लिए, Timer वर्ग आवश्यक है

System.Diagnostics अंदर स्टॉपवॉच वर्ग का उपयोग करने की कोशिश करें: http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

आप इसकी जांच कर सकते हैं कि क्या IsHighResolution क्षेत्र के माध्यम से इसका उच्च संकल्प है। इसके अलावा, आप स्टॉपवॉच के सटीक समाधान को देख सकते हैं:

 int resolution = 1E9 / Stopwatch.Frequency; Console.WriteLine("The minimum measurable time on this system is: {0} nanoseconds", resolution); 

यदि आप इस बारे में चिंतित हैं कि यह वास्तव में कहां है, तो दस्तावेज़ प्रतीत होता है कि यह वास्तव में निचले स्तर के Win32 फ़ंक्शंस को कॉल करता है:

स्टॉपवॉच वर्ग प्रबंधित कोड के भीतर समय-संबंधित प्रदर्शन काउंटरों के हेरफेर की सहायता करता है विशेष रूप से, फ़्रिक्वेंसी फ़ील्ड और GetTimestamp विधि का उपयोग अप्रबंधित Win32 APIs QueryPerformanceFrequency और QueryPerformanceCounter के स्थान पर किया जा सकता है।

इस बारे में क्या है?

 public class HiResTimer { private bool isPerfCounterSupported = false; private Int64 frequency = 0; // Windows CE native library with QueryPerformanceCounter(). private const string lib = "coredll.dll"; [DllImport(lib)] private static extern int QueryPerformanceCounter(ref Int64 count); [DllImport(lib)] private static extern int QueryPerformanceFrequency(ref Int64 frequency); public HiResTimer() { // Query the high-resolution timer only if it is supported. // A returned frequency of 1000 typically indicates that it is not // supported and is emulated by the OS using the same value that is // returned by Environment.TickCount. // A return value of 0 indicates that the performance counter is // not supported. int returnVal = QueryPerformanceFrequency(ref frequency); if (returnVal != 0 && frequency != 1000) { // The performance counter is supported. isPerfCounterSupported = true; } else { // The performance counter is not supported. Use // Environment.TickCount instead. frequency = 1000; } } public Int64 Frequency { get { return frequency; } } public Int64 Value { get { Int64 tickCount = 0; if (isPerfCounterSupported) { // Get the value here if the counter is supported. QueryPerformanceCounter(ref tickCount); return tickCount; } else { // Otherwise, use Environment.TickCount. return (Int64)Environment.TickCount; } } } static void Main() { HiResTimer timer = new HiResTimer(); // This example shows how to use the high-resolution counter to // time an operation. // Get counter value before the operation starts. Int64 counterAtStart = timer.Value; // Perform an operation that takes a measureable amount of time. for (int count = 0; count < 10000; count++) { count++; count--; } // Get counter value when the operation ends. Int64 counterAtEnd = timer.Value; // Get time elapsed in tenths of a millisecond. Int64 timeElapsedInTicks = counterAtEnd - counterAtStart; Int64 timeElapseInTenthsOfMilliseconds = (timeElapsedInTicks * 10000) / timer.Frequency; MessageBox.Show("Time Spent in operation (tenths of ms) " + timeElapseInTenthsOfMilliseconds + "\nCounter Value At Start: " + counterAtStart + "\nCounter Value At End : " + counterAtEnd + "\nCounter Frequency : " + timer.Frequency); } } 

मुझे निम्न समस्या में इस समस्या का समाधान मिला: http://web.archive.org/web/20110910100053/http://www.indigo79.net/archives/27#comment-255

यह आपको बताता है कि उच्च आवृत्ति वाले टाइमर के लिए मल्टीमीडिया टाइमर का उपयोग कैसे करें। यह मेरे लिए ठीक काम कर रहा है !!!

सिस्टम घड़ी " टिक " एक स्थिर दर पर। टाइमर पर निर्भर फ़ंक्शन * s, कॉल * * timeGetDevCaps * की सटीकता बढ़ाने के लिए , जो न्यूनतम समर्थित टाइमर संकल्प को निर्धारित करता है उसके बाद समय कॉल करेंबीनपीयरियोड अपने न्यूनतम पर टाइमर रिज़ॉल्यूशन सेट कर रहा है।

सावधानी: समय शुरू करने से बीबीजीपीयरियोड, अन्य टाइमर पर निर्भर फ़ंक्शन, सिस्टम घड़ी, सिस्टम बिजली उपयोग और शेड्यूलर जैसे महत्वपूर्ण रूप से प्रभावित हो सकता है। इस प्रकार से अपने आवेदन को समय के साथ शुरू करेंबीनपीयरियोड और इसे समाप्त ENDPeriod के साथ

आप इस आलेख में रूपरेखा के रूप में QueryPerformanceCounter () और QueryPerformanceTimer () का उपयोग कर सकते हैं

स्टॉपवॉच टाइमर पर आधारित यह एक कार्यान्वयन है
https://gist.github.com/DraTeots/436019368d32007284f8a12f1ba0f545

  1. यह सभी प्लेटफार्मों पर काम करता है और जहां भी StopWatch.IsHighPrecision == true है। उच्च StopWatch.IsHighPrecision == true

  2. इसकी समाप्त हुई घटना को गैर अतिव्यापी होने की गारंटी है (जो कि जानना ज़रूरी हो सकता है, क्योंकि ईवेंट हैंडलर के अंदर स्थित राज्य परिवर्तन बहु थ्रेडेड पहुंच से असुरक्षित छोड़ दिया जा सकता है)

यहां इसका उपयोग कैसे किया जाता है:

 Console.WriteLine($"IsHighResolution = {HighResolutionTimer.IsHighResolution}"); Console.WriteLine($"Tick time length = {HighResolutionTimer.TickLength} [ms]"); var timer = new HighResolutionTimer(0.5f); // UseHighPriorityThread = true, sets the execution thread // to ThreadPriority.Highest. It doesn't provide any precision gain // in most of the cases and may do things worse for other threads. // It is suggested to do some studies before leaving it true timer.UseHighPriorityThread = false; timer.Elapsed += (s, e) => { /*... e.Delay*/ }; // The call back with real delay info timer.Start(); timer.Stop(); // by default Stop waits for thread.Join() // which, if called not from Elapsed subscribers, // would mean that all Elapsed subscribers // are finished when the Stop function exits timer.Stop(joinThread:false) // Use if you don't care and don't want to wait 

यहां एक बेंचमार्क (और एक लाइव उदाहरण) है:
https://gist.github.com/DraTeots/5f454968ae84122b526651ad2d6ef2a3

Windows 10 पर 0.5 एमएस के लिए टाइमर सेट करने के परिणाम: यहां छवि विवरण दर्ज करें

यह भी उल्लेखनीय है कि:

  1. मैं उबंटू पर मोनो पर एक ही सटीक था

  2. बेंचमार्क के साथ खेलते समय, अधिकतम और एक बहुत ही दुर्लभ विचलन मैंने देखा जो लगभग 0.5 एमएस था (जो शायद कुछ भी नहीं है, यह रीयलटाइम सिस्टम नहीं है, लेकिन फिर भी उल्लेख के लायक है)

  3. स्टॉपवॉच टिक्स टाइमस्पेन टैक्स नहीं हैं। उस विंडोज़ 10 मशीन पर उच्चरेशनलटाइमेटर। टेक्सलैंपम 0.23 [एनएस] है।

  4. बेंचमार्क का सीपीयू उपयोग 0.5ms अंतराल के लिए 10% और 200ms अंतराल के लिए 0.1% है