سؤال

أنا أتساءل ما هي دقة فئة Timer في System.Timers، لأنها مزدوجة (والتي يبدو أنها تشير إلى أنه يمكن أن يكون لديك أجزاء من المللي ثانية).ما هذا؟

هل كانت مفيدة؟

المحلول

أنظمة تشغيل سطح المكتب ويندوز ليست دقيقة حقا أقل من 40ms. نظام التشغيل ببساطة ليس في الوقت الفعلي، وبالتالي يعرض ثراع غير محدد غير محدد. ما يعنيه ذلك هو أنه في حين أنه قد يبلغ عن القيم وصولا إلى MilliSecond أو حتى أصغر، فلا يمكنك الاعتماد حقا على هذه القيم أن تكون ذات معنى حقا. وبالتالي حتى و إن يحصل مجموعة الفاصل الزمني الموقت على بعض قيمة شبه مللي ثانية، ولا يمكنك الاعتماد عليها في الأوقات بين الإعداد وإطلاق النار في الواقع ما قلته.

أضف إلى هذه الحقيقة أن الإطار بأكمله يعمل تحت الحتمه هو غير محدد (قد يعلقك GC وإجراء مجموعة defening الوقت الذي يجب أن ينجب فيه الموقت) وينتهي بك الأمر إلى الأحمال والأحمال من المخاطرة في محاولة لأفعل أي شيء هو الوقت الحرج.

نصائح أخرى

system.timers.timer غريب. إنه يستخدم مضاعفا مثل الفاصل الزمني ولكن في الواقع يدعو الرياضيات. والمعلومات عنها وإلقاء النتيجة ككستين لاستخدامها مع نظام أساسي.Threading.timer. الدقة النظري هي ثم 1 مللي ثانية ولا يمكنك تحديد فاصل يتجاوز 2،147،483،647 سم. بالنظر إلى هذه المعلومات، أنا حقا لا أعرف لماذا يتم استخدام المزدوج كمعلمة الفاصل الزمني.

قبل بضع سنوات، وجدت أنها دقيقة إلى حوالي 16 مللي ثانية ... لكنني لسوء الحظ، لا تتذكر التفاصيل.

يمكنك العثور على هذا بسهولة لنفسك من خلال أداء حلقة تستمر باستمرار مدة الوقت الناتجة والتحقق من خطوات تكنولوجيا المعلومات المثبطة.

قارنت System.Timers.Timer و System.Threading.Timer - كلاهما يعطي أخطاء منهجية حول 8.16 مللي ثانية، خاصة على فترات صغيرة (1000..6000 مللي ثانية). حدثت كل دعوة لاحقة لروتين الموقت مع زيادة الفاصل الزمني من المكالمة الأولى. على سبيل المثال، توقيت مع حرائق الفاصل الزمني لعام 2000 في عام 2000، 4012، 6024، 8036، 10048 مللي ثانية وهلم جرا (الطوابع الزمنية التي تم الحصول عليها من Environment.TickCount و Stopwatch.ElapsedTicks, ، كلاهما إعطاء نفس النتائج).

تنخفض دقة المؤقت إلى نظام 1 مللي ثانية دون بذل الكثير من الجهد في التنفيذ.لقد وصفت للتو سبب double الدقة في هذه الإجابة.عند تكوين نظام للتشغيل بمعدل 1024 مقاطعة في الثانية (باستخدام واجهة برمجة تطبيقات مؤقت الوسائط المتعددة)، يكون الوقت بين المقاطعات 0.9765625 مللي ثانية.الدقة القياسية لأمور التوقيت هي 100ns.يتم تخزين هذه القيم كأعداد صحيحة.لا يمكن تخزين القيمة 0.9765625 دون فقدان الدقة في عدد صحيح بدقة 100 ns.يمثل الرقم الأخير (5) 500 ps.وبالتالي يجب أن يكون القرار أعلى بثلاث مرات.يعد تخزين قيم الوقت هذه في أعداد صحيحة بدقة 100 ps ميؤوس منها لأن عدد صحيح 8 بايت بدقة 100 ps سوف يلف Afer حوالي 21350 يومًا أو حوالي 58 عامًا.هذه الفترة الزمنية قصيرة جدًا بحيث لا يمكن قبولها من قبل أي شخص (تذكر سيناريو عام 2000!).

راجع الإجابة المرتبطة لمعرفة المزيد عن التفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top