对于不成熟的最终用户,这是我目前必须解决的一个问题,他们可以做很多事情来破坏先前贡献者提出的明智建议。一个不成熟的最终用户至少可以做这些事情,甚至更多:
1)没有足够的计算知识能够设置ntp时间同步
2)将他们的计算机时钟设置为不正确的家庭时钟或手机时钟
3) 在 Windows XP 中不小心禁用了 ntp 时间同步并且不知道如何再次启用它,或者他们的计算机日期设置错误,在这种情况下 Windows ntp 不起作用
4) 电脑 BIOS 电池没电了,所以电脑总是在 1970 年启动!
5) 用户将笔记本电脑带到国外,暂时将笔记本电脑时钟设置为当地时间,但不更改时区,所以现在电脑会返回错误的UTC时间!!!
所以你的程序本身必须管理时间,当然你希望以最小的开销来做到这一点。
让我们假设运行您的程序的两个最终用户需要这些程序在将来的同一绝对时间做某事。
我提出了这个方案,它从 cron 工作的工作方式中汲取了一些想法,如果有人能提出改进这个想法的建议,我会很高兴。
1)当您的应用程序启动时,它通过对第三方服务器或您自己的时间服务器的soap调用将自己的内部UTC时间同步到ntp(您可以自己使用ntp保持时间)。
2) 之后,它会从系统时钟添加经过时间以保持时间。如果要求很严格,您可能需要每隔一段时间重复一次 ntp 同步。
3) 然后应用程序查看它需要按时完成的未来工作列表。它需要知道最早的工作。
4)然后它创建一个线程,它在最早的工作之前将其休眠一段时间,减去安全裕度,这取决于您的要求可能提前 10 分钟,提前一小时或两个小时等。
5) 当线程唤醒时,它会通过进一步的soap调用重新检查绝对时间,然后依靠系统时钟来增加经过的时间,直到它到达第一个作业应该执行的时间。
6) 一旦作业被触发(在另一个线程中运行),时间监控线程就会提前计算下一个任务时间,并在此期间再次进入睡眠状态。
想法的增强:
1) 用户可能会在作业到期之前关闭你的应用程序,因此你可能需要一个后台进程或服务,它使用与上述相同的同步方案,来独立监控你的作业列表,存储在数据库或文件中,并启动及时申请。(在 Windows 中,产生应用程序进程)
2) 您的应用程序可能正在动态添加较新、较早的作业或删除作业,因此您的睡眠线程可能需要可唤醒才能重新计算新的较早作业或已删除作业之后的作业。在 Win32 中,您可以通过您的线程在某个事件上等待超时来执行此操作,您将其设置为强制它重新计算睡眠时间。在 Linux 中无疑也有类似的机制。
3) 对于获取时间的 Soap 调用,请记下 Soap 的发送时间和响应的接收时间。如果周转时间太长,您不能依赖时间,可能需要重复通话,或者您可以妥协。例如,如果 Soap 说计算机时钟快 5 分钟,但 Soap 呼叫本身需要一分钟才能回复,那么您只能肯定地说计算机时钟至少快 4 分钟。