timeGetTime和GetTickCount的25天和49天问题

WecanHuang 2011-01-12 02:42:27
这两个函数是得到操作系统从启动到现在所经历过的毫秒数
返回值是DWORD
这个值在0到2^32之间。大约49.71天
如果将返回值转成int
那么大概25天后得到的数值将是负数
那程序肯定会出错的

我现在想知道的是在操作系统启动49.71天后
返回值是重新从0开始呢还是怎样?
如果是从0开始
那程序的时间判断也会有问题的、
比如说我希望5秒后做什么
但是由于归0了所以后面的时间减去前面的时间变成负数了
导致逻辑错误

各位大神
你们怎么解决这种问题的?
...全文
1061 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WecanHuang 2011-02-04
  • 打赏
  • 举报
回复
我知道了,直接想减就行了
dengsf 2011-01-12
  • 打赏
  • 举报
回复
溢出就归0了,即环绕。

假设目标时间是 DWORD dest,当前时间是 DWORD curr,如下:
if( static_cast<int>(curr - dest) >= 0 ){
//已到时
}else{
//未到
}
二进制数模2^32的数,加减其实是模 2^32 的同余运算。
可将整数看成是 从0开始,顺时针增大的一个圈,
则对任何数,它逆向半圈的数减去它,得到的都是负数;顺时向半圈的数减之>=0,
int转型时只是将结果作为有符号数判断而已。并不影响效率。

以上方法的约束,时间差不能超过数值范围一半,即24.8x天多。
Eleven 2011-01-12
  • 打赏
  • 举报
回复
你可以这样考虑,设置个DWORD值,算了就用你上面说到的int类型的变量吧,用来表示天数,经历的天数,当你通过上面的函数得到经历过的毫秒数,如果满一天的话,这个int类型的标记就加1,标识你当前运行了一天
varding 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tttyd 的回复:]

还有一种办法增加一个变量,记录运行的天数或时钟数。

两者结合来计算差值
[/Quote]

自己扩展比较好,GetTickCount比上一次小就说明计数溢出了,自己添加一个变量来记录就行
雪影 2011-01-12
  • 打赏
  • 举报
回复
还有一种办法增加一个变量,记录运行的天数或时钟数。

两者结合来计算差值
雪影 2011-01-12
  • 打赏
  • 举报
回复
参考
http://blog.csdn.net/daoyuly/archive/2009/03/01/3947918.aspx
雪影 2011-01-12
  • 打赏
  • 举报
回复
如果要求365天运行,相信对时钟精度要求也挺高的。
不妨利用CPU的频率法,得到的精度高一些,并且没有时间长度限制

参考函数
QueryPerformanceFrequency
QueryPerformanceCounter

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧