这是一个问题,我现在必须解决一些不熟练的最终用户,他们可以做很多事情来破坏以前贡献者提出的合理建议。一个单纯的最终用户可以做至少这些事情,更多:
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