跨平台毫秒计时器持续49天以上?

问题描述:

我将在C/C++中开发一个小型专用服务器,这将需要永久运行。我一直在研究一些时间函数,因为计算需要毫秒计时。我有2个问题,我面对:跨平台毫秒计时器持续49天以上?

  1. 使用32位整数存储的毫秒数自投产开始将在环绕约49天痕重置为零。我曾考虑过使用64位整数,使用gettimeofday来检索微秒,但这将我带到第二部分。

  2. 似乎 有不被任何标准的系统调用用于获取经过毫秒的平台独立的

我应该怎么做,以解决这两个问题?

+5

请原谅我,如果这是说明一个非常明显的,但1)使用更多的位2)编写一个系统依赖模块,使任何时间的原始你最好的。 – msw 2010-04-06 13:55:10

+0

“需要永久运行” - 即使重新启动也不允许?怎么样在服务器上漏水或断电? LOST的舱口会炸毁,世界结束了吗? – 2010-04-06 14:44:49

+0

@Coronatus:更多的上下文:“一个C/C++服务器,将需要永远的正常运行时间”。假如硬件没有重新启动/故障/陨石影响,硬件会变得任意长,那么这个软件还需要开发吗?否则,你基本上说“这个软件必须每X天重新启动一次”,这显然是一个不好的计划。 – Cascabel 2010-04-06 15:11:41

  1. 使用一个64位的整数,假设,让你有足够的时间

  2. 你是正确的;没有标准。一种可能性是使用Boost DateTime库,或者找到另一个或者自己推出。

祝你好运!

+0

+1用于Boost/DateTime参考。 ** boost :: posix_time :: ptime **是惊人的。你真的应该尝试一下。 – ereOn 2010-04-06 14:11:20

+0

如果5亿年不够,可以使用128位整数 – BeB00 2017-07-10 17:44:49

明显。使用具有平台特定代码的64位整数来获取毫秒数。在包括OSX的Unix上,您需要gettimeofday。在Windows上,获得可靠的毫秒级粒度时间源的好运气;由于该地区存在一些邪恶陷阱,因此code in the Tcl library to do this确实很复杂。

答案1:如果“毫秒计时”你是测量是在20天左右,就可以减去时间无符号数,检查结果作为符号值。这应该给包装定时器的正确结果(从0xffffffff包装到0x00000000)。如果你的时间超过20天,你需要更多的位。

+0

24.85513480902777777777777777777_天将是最大可测量时间增量。 您通常可以对事物进行编码,以避免计算这么长的时间。永远不要设置超过12天的计时器是一个好主意。另一种情况是,如果你确实需要记录一个可能比这个时间更长的时间,那么有一个标志表明如果这个时间已经过去了。这里老到的是,它至少和你可以信任的时间一样长。 – nategoose 2010-04-06 18:11:47

+0

哇,很好的计算... – stefaanv 2010-04-06 18:57:39

正如前面已经说过,你要面对的第一个问题是要获得可靠的毫秒精确的时间。

我承认我有点被这个问题分阶段虽然。

我可以理解为精确定时(毫秒级,甚至微秒),但在毫秒级定时50天似乎......奇怪的需要。

你或许应该先回顾一下你的需求,但它很少需要超过6个或7显著数字......我怕你正在试图获得一个尺寸适合所有这些持续时间对象。

也许你应该改为分类你的持续时间:

  • 最多几分钟>使用精确到毫秒
  • 否则>使用精确到秒(自1970年1月1日著名的计数)

因为......在2个月的规模上,1/10秒的感觉是什么?