调用time()函数会出现时间倒退的奇怪现象?

kacy16 2015-01-13 06:36:20
1 在WIN7系统(开发工具VC)上开发了一软件,软件的程序中有一部分
的处理逻辑为 先记录下一开始时间,然后在开始时间之后的两秒内
一直在检测某种状态,如果检测到该状态,则返回true,如果没有检测到该状态则返回false,大概的代码如下:
bool is_status_change()
{
bool blnret = false;
unsigned int start_secs;
unsigned int cur_secs;

do_some_thing();
start_secs =time(NULL); //获得系统时间(单位:秒)

while ( (cur_secs= (unsigned int)time(NULL)) - start_secs <=2 )
{
int checkret = check_status();
if (checkret == 1)
{
blnret =true;
break;
}
Sleep(30);
}
return blnret;
}

整个软件大概运行了有4天, 其中is_status_change是以很频繁的次数被调用着,理论上均可以返回true的正确值。
但是通过日志记录可以得知,is_status_change有一次返回了false的错误值,究其错误的原因,竟然是发现
time(NULL)函数会发生时间倒回的现象,在 while ( (unsigned int)time(NULL) - start_secs <=2 )语句中
的获取的当前时间cur_secs比开始时间start_secs要小,由于都是unsigned值,一相减,负数变成很大的正数了。
大概的日志记录如下:
2015-01-05 21:08:13 is_status_change 返回true
2015-01-05 21:08:14 is_status_change 返回true
.....
2015-01-05 21:09:10 is_status_change 返回true
2015-01-05 21:09:11 is_status_change 返回true
2015-01-05 21:09:11 is_status_change 返回true
2015-01-05 21:09:12 is_status_change 返回true
2015-01-05 21:08:13 is_status_change 返回false
2015-01-05 21:08:14 is_status_change 返回true
2015-01-05 21:08:14 is_status_change 返回true
............
2015-01-05 21:09:09 is_status_change 返回true
2015-01-05 21:09:10 is_status_change 返回true

通过日志记录可以推断得出,time()函数在某些时候返回的时间秒数会比前一阶段所调用时返回的要小,即会发生时间倒转的现象,想请教各位高手,我的这个推断是否正确合理,各位是否有在实际情况遇到这种现象,以及怎么避免这种异常现象的发生?谢谢!
...全文
844 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2015-02-03
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
[quote=引用 8 楼 jennyvenus 的回复:] 查原因的事情,太麻烦了,不如当发现time差值为负数的时候,将变小的time改为当前time,然后一切继续。
英雄所见略同。[/quote] 得到赵老湿的认同,非常荣幸。
fang 2015-02-02
  • 打赏
  • 举报
回复
你的PC机时间有没有乱的情况,如果有那要检查下你的CMOS电池是不是供电不足。
赵4老师 2015-02-02
  • 打赏
  • 举报
回复
引用 8 楼 jennyvenus 的回复:
查原因的事情,太麻烦了,不如当发现time差值为负数的时候,将变小的time改为当前time,然后一切继续。
英雄所见略同。
用户 昵称 2015-01-15
  • 打赏
  • 举报
回复
查原因的事情,太麻烦了,不如当发现time差值为负数的时候,将变小的time改为当前time,然后一切继续。
oyljerry 2015-01-14
  • 打赏
  • 举报
回复
系统时间是不是发生了改变,造成时间乱了
zgl7903 2015-01-14
  • 打赏
  • 举报
回复
系统是不是开启了自动网络时间同步?
homesos 2015-01-14
  • 打赏
  • 举报
回复
另外,日志时间要精确到毫秒,才利于分析。
homesos 2015-01-14
  • 打赏
  • 举报
回复
使用高精度的时间时,会有时间乱窜的现象,那是因为使用多核CPU导致的,必须指定一个核 ,使用同个核上的时间就不会有问题。 不过,我感觉你现在问题,不像是这种时间问题导致的现象,需要打出更详细的执行路径和确切数据,才能进一步地分析。并澄清一下应用环境,排除其他干扰。
lzl_2008 2015-01-13
  • 打赏
  • 举报
回复
应该是有其他程序修改了系统时间,比如时间自动同步程序。时间修改可以接收到WM_TIMECHANGE消息 把time(NULL)改成用gettickcount()可以避免这种修改系统时间引起的bug
worldy 2015-01-13
  • 打赏
  • 举报
回复
应该是lz的逻辑在某个分支有问题,不是time的问题,不要使用null,将调用时候的时间值也弄出来,记录到日记,这样比较好定位问题 time_t time( time_t *timer );
笨笨仔 2015-01-13
  • 打赏
  • 举报
回复
你的日志时间怎么是重叠的? 你的程序改用 do while循环试试

2,640

社区成员

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

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