كيفية تسجيل الأوقات النسبية بين أجهزة الكمبيوتر؟

StackOverflow https://stackoverflow.com/questions/827473

  •  05-07-2019
  •  | 
  •  

سؤال

أحتاج إلى تسجيل الأحداث بشكل مستقل على أجهزة كمبيوتر مختلفة وإعادة بناء الترتيب الذي حدثت به تلك الأحداث بالنسبة لبعضها البعض.ويدعو الحل إلى أن يكون كل جهاز كمبيوتر مستقلاً نسبياً؛لا يمكنهم التحدث مباشرة مع بعضهم البعض أو مع مصدر واحد.

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

لذا من كل جهاز أحصل على سجل مليء بهذه الأشياء

public class Activity {
    DateTime TimeOccurred { get; set; }
    string Description { get; set; }
}

عندما يحدث (1) أو (2) أعلاه، أقوم بإضافة نشاط إلى السجل وبثه إلى الأجهزة الأخرى، التي تضيف نفس النشاط إلى سجلها، مع كون TranslatedTime هو وقتها الخاص:

public class TimeSynchronization : Activity {
    string SourceMachine { get; set; }
    DateTime TranslatedTime { get; set; }
}

لذلك سيكون لدى الجهاز "أ" (بالترتيب):

TimeSynchronization "started" at 3:00 am.
Activity "asked a question" at 3:05 am.
TimeSynchronization from machine B at 3:05 am.
TimeSynchronization "clock changed" at 3:03 am.
Activity "received an answer" at 3:04 am.

وسيكون للآلة B (بالترتيب):

TimeSynchronization "started" at 3:05 am.
TimeSynchronization "clock changed" at 3:06

لذلك أحتاج إلى إعادة بناء نفس الترتيب والتوقيت لهذه الأحداث المذكورة أعلاه، إلى شيء مثل:

On machine A: TimeSynchronization "started" at 0:00
On machine A: Activity "asked a question" at 0:05
On machine B: TimeSynchronization "started" at 0:05
On machine A: TimeSychronization from machine B at 0:05
On machine A: TimeSynchronization "clock changed" at 0:06
On machine B: TimeSynchronization "clock changed" at 0:06
On machine A: Activity "received an answer" at 0:07

ما هي أفضل طريقة لأخذ List<Activity> من كل جهاز ودمجها في قائمة واحدة مع ترتيب الأحداث؟

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

المحلول

إذا تم توصيل الجهازين عبر الشبكة ، يمكن للبرنامج أن يسأل الجهاز الآخر عن الوقت. وبهذه الطريقة ، يمكن أن يطلب برنامجك على الجهاز الوقت على كل من A و B ثم تسجيل كلتا الحالتين.

أذكر أن الوقت يمكن أن يتغير خلال اليوم (من المفترض أن المستخدم غير الوقت). يمكنك اكتشاف هذا باستخدام الحدث Win32.TimeChanged.

نصائح أخرى

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

يبدو أنهم يريدونك أن تتجه نحو المعاملات الموزعة

أيضا ، تحقق من بروتوكول وقت الشبكة:

NTP هو بروتوكول مصمم لمزامنة ساعات أجهزة الكمبيوتر عبر الشبكة.

أعتقد أنك تريد تسجيل كل شيء في UTC (وقت عالمي). سيسمح ذلك بتسجيل الأوقات مع أوقاتها بالنسبة إلى نقطة مشتركة في الوقت المناسب ويجعل مقارنة التواريخ/الأوقات سهلة للغاية. لعرضها في الوقت المحلي ، يمكنك ببساطة تحديد الإزاحة وحساب الفرق من وقت UTC إلى Local. على سبيل المثال ، على الساحل الشرقي ، UTC -5 ، لذلك إذا كان وقت UTC هو الساعة 17:00 ، فإن التوقيت المحلي في نيويورك هو الساعة 12:00 وفي دالاس في UTC -6 ، لذلك الساعة 11:00 صباحًا.

لذا ، إذا كان لديك حدث في الساعة 11:10 صباحًا في دالاس ، فإن وقت UTC هو 17:10 ، وحدث في نيويورك في الساعة 12:05 مساءً هو 17:05 UTC ، أنت تعرف أن حدث نيويورك حدث أولاً ، ولكن إذا لقد قارنت الأوقات التي لا يبدو أن هذا كذلك.

تتمتع UTC أيضًا بميزة أنه يمثل دائمًا جميع الـ 24 ساعة في اليوم ، بحيث في الخريف عندما تغادر وقت التوفير في ضوء النهار ، لا تحصل على مجموعتين من أحداث من الساعة 2 صباحًا إلى 3 صباحًا ولا تخسر ساعات عندما تنطلق إلى الأمام على وقت التوفير Dalylight.

أولًا:إذا كانت العمليات على كل جهاز متوازية حقًا، فلا يمكنك ضمان وجود ترتيب متسلسل قانوني واحد.إذا كان هناك بعض التنسيق في العملية الشاملة، فمن الأفضل أن تستخدم نوعًا ما من التسلسل في البروتوكول، بحيث يمكنك الفرز حسبه.

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

إذا كنت بحاجة إلى مزامنة دقيقة للغاية بين أجهزة الكمبيوتر ، فاستخدم GPS.

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