最近在开发基于WINCE6.0+2443的GPS产品的时候,发现我的机器在电池供电的时候,开机之后,如果没有其他动作,那么大概10分钟左右,我的系统会进入sleep的状态,后来发现我在实现电池驱动的时候把函数BatteryPDDGetStatus()下面部分注释掉了
memcpy(pstatus, &gpStatus->sps, sizeof(*pstatus));
*pfBatteriesChangedSinceLastCall = gpStatus->fChanged;
if(*pfBatteriesChangedSinceLastCall) {
gpStatus->fChanged = FALSE; // reset changed flag if it's set
}
为什么注释了上面这部分代码就会出现这个问题了,我们来看看电池驱动MDD层BatteryAPIGetSystemPowerStatusEx2()的定义:
上图的第117行用来判断系统当前状态是否有AC供电还是电池供电,目前我还没有完全搞清楚为什么是AC供电的情况下,系统就不会进入sleep,我想是和上图中调用的BatteryAPIStopwatch()函数有很大的关系。我后来在BatteryPDDGetStatus()函数返回之前加了下面这句:
pstatus->ACLineStatus =AC_LINE_ONLINE;
这样即使是在电池供电的情况下(这时候,是我做了个假动作来告诉BatteryAPIGetSystemPowerStatusEx2()函数:系统一直是AC供电),这就证明了在AC供电的情况下系统不会进入sleep状态,但到底是为什么呢?有待于后面去彻底搞清楚了,如果大家知道的,麻烦大家告知。
上面提到说加pstatus->ACLineStatus =AC_LINE_ONLINE;这行语句可以不让系统进入sleep,但对于一个需要电池供电的产品来说是不能这样解决这个问题的,因为应用程序需要根据pstatus->ACLineStatus来判断当前是否在充电,以便告诉用户的充电状态。后来经过上网查资料和CSDN各位高手的指点,我在BatteryPDDGetStatus()函数返回之前加入了下面的代码就解决了这个问题:
我为什么加了if(NoEnterSleepStatus >= 50)这个判断呢,就是不想每次调用(隔5s调用一次)BatteryPDDGetStatus()函数的时候就去执行上面的动作,只要赶在系统进入sleep之间timeout之前调用了上面的代码就可以阻止系统进入sleep状态。
在这里有个疑问,网上有很多网友说通过定时调用SystemIdleTimerReset()函数也可以阻止系统进入sleep状态,但我在上面的位置加了下面的代码后也无法阻止系统进入sleep状态,很奇怪,希望知者告知,谢谢啊