這是一個問題,我現在必須解決一些不熟練的最終用戶,他們可以做很多事情來破壞以前貢獻者提出的合理建議。一個單純的最終用戶可以做至少這些事情,更多:
1)沒有足夠的計算知識,能夠建立NTP時間同步
2)自己的計算機時鐘設置爲房子時鐘或手機時鐘是不正確
3)在Windows XP中意外禁用NTP時間同步和不知道如何重新啓用它,或者在其計算機日期爲錯誤,在這種情況下的Windows NTP不工作
4)電腦bios電池已經平了,所以pc始終在1970年啓動!
5)用戶將筆記本電腦帶到國外並暫時將筆記本電腦時鐘設置爲當地時間,但不更改時區,因此現在電腦將返回錯誤的utc時間!
所以你的程序本身將不得不管理時間,當然你想用最小的開銷來做到這一點。
讓我們假設兩個運行您的程序的最終用戶需要程序在未來的相同絕對時間執行某些操作。
我提出這個方案,它從cron作業的方式中獲得一些想法,如果任何人都可以提出改進意見,我會很高興。 1)當你的應用程序啓動時,它通過肥皂呼叫到第三方服務器或你自己的時間服務器(你可以用ntp自己保持時間)來同步它自己的內部utc時間到ntp。
2)之後,它添加從系統時鐘流逝的時間以保持時間。如果要求很嚴格,您可能需要每隔一段時間重複一次ntp同步。
3)然後,應用程序查看它需要按時完成的未來作業列表。它需要知道最早的工作。
4)然後創建一個線程,讓它在最早的工作之前放置一段時間,而不是安全邊界,這取決於您的要求可能提前10分鐘,提前一到兩個小時等等。
5)當線程喚醒時,它會通過進一步的肥皂調用重新檢查絕對時間,然後依靠系統時間時鐘添加經過的時間,直到達到第一個工作應執行的時間出。
6)只要作業被觸發(在另一個線程中運行),時間監視線程就會計算下一個任務時間,並在此期間再次進入睡眠狀態。
增強的想法:
1)用戶可以在到期作業之前關閉您的應用程序,所以你可能需要一個後臺進程或服務,它使用上述同樣的同步方案,以獨立地監控你的工作列表,存儲在數據庫或文件中,並及時啓動應用程序。 (在Windows中,生成應用程序進程)
2)您的應用程序可能正在添加更新的,更早的作業或正在刪除作業,因此您的睡眠線程可能需要被喚醒才能重新計算新的早期作業,或在刪除作業之後的作業。在Win32中,你可以通過你的線程在一個事件上等待超時來做到這一點,你設置它強制它重新計算睡眠時間。在Linux中毫無疑問存在類似的機制。
3)對於SOAP調用,以獲得時間保持一個音符時發送的SOAP和接收到響應的時候。如果週轉時間過長,您不能依賴時間,可能需要重複呼叫,否則您可能會妥協。例如,如果肥皂表示計算機時鐘快5分鐘,但Soap調用本身需要一分鐘才能回覆,那麼您只能確定計算機時鐘至少快4分鐘。
我擡頭看了Lamport的論文,似乎在討論時鐘同步時被廣泛引用。不幸的是,[看起來](http://www.amazon.com/Distributed-Systems-Principles-Paradigms-2nd/dp/0132392275)這個算法不適合實時應用程序(就像這裏所討論的那樣)(http://stackoverflow.com/questions/12760388/how-to-set-a-variable-that-represents-a- time-in-the-future-in-absolute-terms-obj))..關於非NTP依賴性的實時時鐘同步算法的任何提示? – abbood 2012-10-08 14:19:37