سؤال

هذا السؤال حول Timers لخدمات Windows لقد شغلت تفكيرى:

قل لدي (وأفعل) خدمة Windows هذه تنتظر whithandle. وعندما استيقظ، يغوص في انتظار تدور كما أظهرت أدناه في مخطط انسيابي

انتظر مخطط تدور http://www.86th.org/waitspin.jpg

أنا فضولي إذا كنت تستخدم مؤقت سيكون أفضل من حلقة الانتظار (تسمى أحيانا تنتظر تدور). سأكون صادقا، لقد استخدمت أبدا أجهزة توقيتا لأي شيء آخر غير العبث الخاص بي.

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

اسمحوا لي أن أعرف إذا كان هذا يجب أن يكون ويكي

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

المحلول

لا أراك تحصل على أي فائدة من الموقت. أنت تتصرف بشكل أساسي بموجب مؤقت على أي حال مع مكالمة النوم الخاصة بك، وعدم كونك خنزير عرض النطاق الترددي لأن النوم ينتج عنه شريحة الوقت. وجود مؤقت صريح يستيقظ ويتصل بك هو مجرد تعقيد التعليمات البرمجية.

لن أقول حقا أنك تقوم بانتظار تدور، لأنني أفكر بشكل عام في الانتظار في الدوران كشيء لا ينام. انها تحترق فقط كل وقت المعالج في انتظار إشارة الذهاب.

نصائح أخرى

النوم موضوعا وانتظارك على مقبض مع مهلة هو في الأساس نفس الشيء تحت الأغطية. وأعتقد أن أجهزة توقيت تنفذ بشكل أساسي باستخدام النوم، لذلك لا يوجد فرق كبير هناك أيضا. بمعنى آخر، يمكنك تبسيط التعليمات البرمجية الخاصة بك عن طريق الانتظار على المقبض مع مهلة في حلقة واحدة والتحقق لمعرفة سبب تحرير الانتظار (البيانات المتاحة أو المهلة)، بدلا من تنفيذ حلقات الانتظار المنفصلة والنوم. أكثر كفاءة قليلا من الحلقات المستقلة.

من الناحية المثالية، لن تستخدم النوم على الإطلاق، وببساطة تعتمد على رمز توليد البيانات لرفع الحدث الذي ينتظره رمز الاستهلاك بشكل صحيح، مع مهلة طويلة للتعامل معه عندما يذهب مصدر الحدث بعيدا.

إذا كانت البيانات الخارجية، مثل على مأخذ توصيل أو جهاز إدخال آخر، فيمكن تعيين المقبض عموما للسماح بانتظار البيانات المتاحة - لا حاجة إلى الاستطلاع في هذه الحالة نظرا لأن الحدث سيتوجر دائما عند الاستعداد للاستهلاك.

نحن نستخدم المواضيع. لا يفعلون فقط مثل الموقت، لكنهم يعطونا مؤشرا لأداء عمليات أخرى أثناء النوم.

أعتقد أنه يعتمد حقا على الاحتياجات الخاصة بك:

  1. تشغيل المهمة كل 5 دقائق (على سبيل المثال، 12:00، 12:05، 12:10، ...)
  2. عند إكمال المهمة الحالية، قم بتشغيل المهمة التالية بعد 5 دقائق.

يبدو أن Timer سهلا للحالة 1 و Leads.Sleep يبدو سهلا للحالة 2، على الرغم من أن الموقت والخيط. يمكن أن تفعل كل منهما.

في الواقع، في الواقع، تعليق أطول (بما في ذلك بعض النظر في القضية 1) لسؤال مماثل (خدمة Windows المجدولة).

الاقتراع سيء، ويمكن تجنبه دائما تقريبا. من حين لآخر أشياء تافهة أنها أقل سيئا من التعقيد اللازم لتجنب ذلك.

ما المصدر الذي تقترب عنه "لديه بيانات؟" أنه لا يمكنك التحول إلى نوع من مقبض الانتظار؟

أيضا، لا Sleep() في كود خطير (مثل الخدمة) لأي وقت مهم من الوقت. الحظر الوحيد الذي يمكنك القيام به هو WaitFor[Single|Multiple]Objects(...) حيث تتضمن قائمة المقابض حدثا يطلق عند حان الوقت لإغلاق العملية. تجد في كل مكان كنت تتصل Sleep(millisec) واستبدالها WaitForSingleObjects(g_shutdownEvent, millisec).

كما يفسر ريموند تشن، "حسنا، مهما كان الأمر." إذا كنت لا تستطيع معرفة وسيلة للحصول عليها مخالفة عندما تكون بياناتك جاهزة - ثم سولك.

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