wince6 TQ210电源管理对屏幕保护的影响

原文地址:http://www.360doc.com/content/12/0208/13/8354145_185023839.shtml

在platform.reg里对Timerout赋值成零,发现生成的注册表是更新了,但是值没有起作用。

在common.reg里对Timerout赋值成零,可以生效。感觉还是很奇怪。

最后再网上查找了,发现PM正常启动读到的是默认值,没有读取到注册表的值。

 

说明:wince 的电源管理module就是PM.DLL,其代码定位在PUBLIC/COMMON/OAK/DRIVER/PM下面。

wince启动时,PM将在register下读取用户设置的timeout vaule(如题),注册表位置和我设置的demo值为:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/Timeouts]
    "ACUserIdle"=dword:0a               ; in seconds
    "ACSystemIdle"=dword:20    ; in seconds
    "ACSuspend"=dword:3c                ; in seconds
    "BattUserIdle"=dword:0a            ; in seconds
    "BattSystemIdle"=dword:20   ; in seconds
    "BattSuspend"=dword:3c            ; in seconds

PM默认的休眠时间为(AC,battery都一样)
#define DEF_TIMEOUTTOUSERIDLE           60          // in seconds, 0 to disable
#define DEF_TIMEOUTTOSYSTEMIDLE         300         // in seconds, 0 to disable
#define DEF_TIMEOUTTOSUSPEND            600         // in seconds, 0 to disable

           m_dwACSuspendTimeout = DEF_TIMEOUTTOSUSPEND * 1000;    
        m_dwACTimeoutToSystemIdle = DEF_TIMEOUTTOSYSTEMIDLE * 1000 ;
        m_dwACUserIdleTimeout = DEF_TIMEOUTTOUSERIDLE * 1000;
        
        m_dwBattSuspendTimeout = DEF_TIMEOUTTOSUSPEND * 1000;
        m_dwBattTimeoutToSystemIdle = DEF_TIMEOUTTOSYSTEMIDLE * 1000 ;
        m_dwBattUserIdleTimeout = DEF_TIMEOUTTOUSERIDLE * 1000;
在Pm装载时,函数PlatformLoadTimeouts将从注册表中得到这个时间。

这里,PM module存在一个BUG,不管你在 电源=》方案 中设置各种空闲time为多少,重新启动系统之后,PlatformLoadTimeouts读取到的是默认值60,300,600。而我们的注册表中明明就是我们设置的值啊!
    通过将PM porting 到BSP中来编译,发现在 电源=》方案 设置完成后,PM的PlatformLoadTimeouts重新被调用,这样就有效了,而在OS 启动时PlatformLoadTimeouts

            m_dwACSuspendTimeout = RegReadStateTimeout(hk, _T("ACSuspend"), DEF_TIMEOUTTOSUSPEND);
            m_dwACTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("ACSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
            m_dwACUserIdleTimeout = RegReadStateTimeout(hk, _T("ACUserIdle"), DEF_TIMEOUTTOUSERIDLE);
             
            m_dwBattSuspendTimeout = RegReadStateTimeout(hk, _T("BattSuspend"), DEF_TIMEOUTTOUSERIDLE);
            m_dwBattTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("BattSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
            m_dwBattUserIdleTimeout = RegReadStateTimeout(hk, _T("BattUserIdle"), DEF_TIMEOUTTOSUSPEND);
返回夜没有错误,确实是60,300,600。查找发现这时候用户注册表还没有装入,其就读出了默认值。

      知道问题的所在,我们只需要在注册表装入之后再invoke 一下PlatformLoadTimeouts就Ok了,
           跟踪 PlatformLoadTimeouts的invoke,有PmReloadActivityTimeouts《==PM_RELOAD_ACTIVITY_TIMEOUTS_EVENT 《== m_hevReloadActivityTimeouts 《== _T("PowerManager/ReloadActivityTimeouts")
我们就可以用 一个全局事件名 _T("PowerManager/ReloadActivityTimeouts") 来在想发起一个PlatformLoadTimeouts的动作就ok了。将下面的代码放入合适的位置
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE,_T("PowerManager/ReloadActivityTimeouts"));
 if(hEvent != NULL)
 {  
  SetEvent(hEvent);  
  CloseHandle(hEvent);  
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值