4392|10

1

帖子

1

TA的资源

一粒金砂(初级)

楼主
 

怎样设置系统进入Suspend状态? [复制链接]

各位大虾好,

我最近需要编程让系统进入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

最新回复

楼主是要做WinCE系统的电源管理吧? 这个只要在驱动中添加电源管理就可以了,计时的工作由PM去做,应该不需要用"SetEvent去通知内核reload Timeout时间这种方式来实现系统进入suspend状态"。   详情 回复 发表于 2010-3-25 10:01
点赞 关注

回复
举报

10

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
注册表设置挂起不试过,AP想让系统挂起的话调用函数
SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE );
(点开始菜单能挂起的情况下,也就是底层上已经能够实现的情况下)
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
一楼说的这个动作可以挂起,底层是没问题的。
控制面板上的Schemes那边设置也可以,就是我的AP不能让系统挂起。
好奇怪,我看了WinCe的control panel的代码,其实也跟我所写的差不多,都是写注册表,然后通知内核reload一下timeout时间。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 3 楼 veabol 的回复:
注册表设置挂起不试过,AP想让系统挂起的话调用函数
SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE );
(点开始菜单能挂起的情况下,也就是底层上已经能够实现的情况下)


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

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
suspend是一直进不去,还是比你预想的时间长?

你设置的时间应该是systemidle之后等待的时间,如果没有任何用户操作就会进入Suspend。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,这些我知道。谢谢楼上!
我终于找到原因了,原来是我的窗口基类里面有一个线程不断在扫描和更新时间(用到的函数是CTime::GetCurrentTime())使得系统无法进入suspend。我将这个获取时间的这一段去掉就可以顺利进入suspend。

不过就是奇怪,在扫描时间而已,为什么会对系统切换状态产生影响!而偏偏只对suspend状态切换造成影响,哪位高手知道请指点指点!!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
你点击一下菜单“开始”——“挂起”试试看,
如果这个也不可以进入到Suspend状态,那说明是底层没有实现。
如果可以,那可能就是电源管理的问题了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
是啊,晕死。
真不知道会是因为这个而进入不了suspend
不过还是谢谢楼上了
结贴…………
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 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不能,真是奇了怪了。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

10
 
呵呵,很隐蔽的问题啊,还真没碰到过,原因也就不太清楚了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 4 楼 dansley 的回复:
引用 3 楼 veabol 的回复:
注册表设置挂起不试过,AP想让系统挂起的话调用函数
SetSystemPowerState( NULL, POWER_STATE_OFF, POWER_FORCE );
(点开始菜单能挂起的情况下,也就是底层上已经能够实现的情况下)


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


楼主是要做WinCE系统的电源管理吧?
这个只要在驱动中添加电源管理就可以了,计时的工作由PM去做,应该不需要用"SetEvent去通知内核reload Timeout时间这种方式来实现系统进入suspend状态"。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表