怎样设置系统进入Suspend状态?

tomclus006   2010-3-24 17:39 楼主
各位大虾好,

我最近需要编程让系统进入UserIdle,SystemIdle和Suspend状态。
我的做法是:
1, 分别设置useridle, systemidle, suspend 的timeout时间
2, 将获取到的时间(以秒为单位)写到注册表HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Power\\Timeouts下的ACSuspend, ACSystrmIdle, ACUserIdle下(电源供电)。
3, 利用下面代码通知内核重新加载timeout时间:
HANDLE hevReloadActivityTimeouts = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/ReloadActivityTimeouts"));
                if (hevReloadActivityTimeouts)
                {
                        SetEvent(hevReloadActivityTimeouts);
                        CloseHandle(hevReloadActivityTimeouts);
                }
问题:
问题是系统可以在设定的useridle timeout时间进入useridle,也可以在设定的systemidle时间内进入systemidle状态,但是不会在设定的suspend timeout时间(非0值)之后进入suspend状态。

哪位高手做过类似的,请指点一二,无限感激!!!

PS:以上采用的是wince6, Samsung6410

回复评论 (10)

注册表设置挂起不试过,AP想让系统挂起的话调用函数
SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE );
(点开始菜单能挂起的情况下,也就是底层上已经能够实现的情况下)
点赞  2010-3-24 19:56
一楼说的这个动作可以挂起,底层是没问题的。
控制面板上的Schemes那边设置也可以,就是我的AP不能让系统挂起。
好奇怪,我看了WinCe的control panel的代码,其实也跟我所写的差不多,都是写注册表,然后通知内核reload一下timeout时间。
点赞  2010-3-24 18:43
引用: 引用 3 楼 veabol 的回复:
注册表设置挂起不试过,AP想让系统挂起的话调用函数
SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE );
(点开始菜单能挂起的情况下,也就是底层上已经能够实现的情况下)


这种方法当然可以是系统挂起。
但是我并不仅仅是需要系统挂起,而是需要设置timeout时间,让系统在进入systemidle的一定时间之后挂起。就像WinCe的control panel上的power/schemes里面的设置一样。
我先是disable了GWES,然后SetEvent去通知内核reload Timeout时间这种方式来实现系统进入suspend状态!
点赞  2010-3-25 09:41
suspend是一直进不去,还是比你预想的时间长?

你设置的时间应该是systemidle之后等待的时间,如果没有任何用户操作就会进入Suspend。
点赞  2010-3-25 14:04
呵呵,这些我知道。谢谢楼上!
我终于找到原因了,原来是我的窗口基类里面有一个线程不断在扫描和更新时间(用到的函数是CTime::GetCurrentTime())使得系统无法进入suspend。我将这个获取时间的这一段去掉就可以顺利进入suspend。

不过就是奇怪,在扫描时间而已,为什么会对系统切换状态产生影响!而偏偏只对suspend状态切换造成影响,哪位高手知道请指点指点!!
点赞  2010-3-25 16:39
你点击一下菜单“开始”——“挂起”试试看,
如果这个也不可以进入到Suspend状态,那说明是底层没有实现。
如果可以,那可能就是电源管理的问题了。
点赞  2010-3-24 18:19
是啊,晕死。
真不知道会是因为这个而进入不了suspend
不过还是谢谢楼上了
结贴…………
点赞  2010-3-26 16:28
引用: 引用 4 楼 dansley 的回复:
引用 3 楼 veabol 的回复:
注册表设置挂起不试过,AP想让系统挂起的话调用函数
SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE );
(点开始菜单能挂起的情况下,也就是底层上已经能够实现的情况下)


这种方法当然可以是系统挂起。
但是我并不仅仅是需要系统挂起,而是需要设置timeout时间,让系统在进入sys……


先谢谢楼上的热情!
对,不过电源管理的是BSP那块做了,而且用WinCe的control panel上的power/schemes里面的程序设置时候功能都是正常的, 能够正常进入suspend状态。我很纳闷,我不知道自己哪一步做的不够,我也查看了注册表,那些值都能通过自己写的AP正确的修改成功,就是在预设时间进不去suspend。
我修改了timeout时间就得通知内核去reload timeout时间才能在你预设的时间进入suspend吧。
useridle和systemidle都可以准时进入,就是suspend不能,真是奇了怪了。
点赞  2010-3-25 11:18
呵呵,很隐蔽的问题啊,还真没碰到过,原因也就不太清楚了。
点赞  2010-3-25 17:23
引用: 引用 4 楼 dansley 的回复:
引用 3 楼 veabol 的回复:
注册表设置挂起不试过,AP想让系统挂起的话调用函数
SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE );
(点开始菜单能挂起的情况下,也就是底层上已经能够实现的情况下)


这种方法当然可以是系统挂起。
但是我并不仅仅是需要系统挂起,而是需要设置timeout时间,让系统在进入sys……


楼主是要做WinCE系统的电源管理吧?
这个只要在驱动中添加电源管理就可以了,计时的工作由PM去做,应该不需要用"SetEvent去通知内核reload Timeout时间这种方式来实现系统进入suspend状态"。
点赞  2010-3-25 10:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复