用IOKit阻止Mac进入睡眠模式
时间: 2010-02-01 14:25 点击: 次
如果你的软件是全屏模式运行的(比如游戏),并有长时间的视频或演示模式,那就需要像DVD播放器和Keynote那样禁用Mac休眠。关于这方面的官方文档有点乱,这里做一个总结吧。
作者 bmwmengwei
英文原文 http://www.cimgf.com/2009/10/14/the-journey-to-disabling-sleep-with-iokit/
如果你的软件是全屏模式运行的(比如游戏),并有长时间的视频或演示模式,那就需要像DVD播放器和Keynote那样禁用Mac休眠。关于这方面的官方文档有点乱,这里做一个总结吧。官方文档在这里:http://developer.apple.com/mac/library/qa/qa2004/qa1160.html
英文原文 http://www.cimgf.com/2009/10/14/the-journey-to-disabling-sleep-with-iokit/
如果你的软件是全屏模式运行的(比如游戏),并有长时间的视频或演示模式,那就需要像DVD播放器和Keynote那样禁用Mac休眠。关于这方面的官方文档有点乱,这里做一个总结吧。官方文档在这里:http://developer.apple.com/mac/library/qa/qa2004/qa1160.html
UpdateSystemActivity(OverallAct);
文档里说,每30秒启动一次这玩意儿,挺没意思的,我每30秒来一次虚拟的鼠标运动不就得了?这种方法太老土了,新方法是使用IOKit,苹果同样有个介绍这种方法的文档
--http://developer.apple.com/mac/library/qa/qa2004/qa1340.html
参考代码
#import <IOKit/pwr_mgt/IOPMLib.h>
...
// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep
IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreate(kIOPMAssertionTypeNoDisplaySleep,
kIOPMAssertionLevelOn, &assertionID);
if (success == kIOReturnSuccess)
{
//Add the work you need to do without
// the system sleeping here.
success = IOPMAssertionRelease(assertionID);
//The system will be able to sleep again.
}
这段代码搞得我很郁闷,因为此前对这玩意儿不熟。没办法只好到XCode文档里去查,却什么也没查到。查看IOPMLib.h代码发现这是个32位无符号整数型。然后查找IOPMAssertionCreate(),发现它只出现于Leopard系统里,雪豹系统更推荐用IOPMAssertionCreateWithName()这种方式。IOPMAssertionCreateWithName() 比多一项参数,废话少说,
IOPMAssertionCreate()IOPMAssertionCreateWithName()管用就行。
注意,IOPMAssertionCreateWithName()在Leopard系统下不能用,所以,要么在Xcode3.1/Leopard 下用IOPMAssertionCreate();或者在雪豹系统
XCode 3.2里用IOPMAssertionCreateWithName()。
从苹果官方文档给出的例子来看,你可以用kIOPMAssertionTypeNoDisplaySleep防止显示器休眠,用kIOPMAssertionTypeNoIdleSleep防止系统休眠。但我的测试结果是kIOPMAssertionTypeNoDisplaySleep既能防止显示器休眠又能防止系统休眠,就像放视频或做幻灯一样。kIOPMAssertionTypeNoIdleSleep会让显示器休眠,但系统不会。这样就可以运行一些长时间计算的大型项目而不用担心由于键盘鼠标没动做而使系统进入休眠。
最后,这里有个实例(http://www.cimgf.com/wp-content/uploads/2009/10/DisableSleep.zip),它用的是IOPMAssertionCreate()而不是IOPMAssertionCreateWithName()以便兼容Leoprd和雪豹系统。
顶一下(0)
0%
踩一下(0)
0%
打印 上一篇:让软件只在雪豹下以64位模式运行
下一篇:查看程序运行时间的代码
发表评论
本类文章点击排行榜
- [06-18] Cocoa夜未央第一期 Cocoa的基本
- [06-18] UITableView实例教程:创建Tabl
- [06-18] Cocoa夜未央第三期 MVC,界面编
- [06-18] Cocoa夜未央第二期 xcode及基本
- [06-02] XCode自带Source Control Manager(SC
- [07-27] Xcode 4 新特性介绍
- [06-11] Google的开源苹果软件更新框架
- [06-11] Leopard轻松编程:帮你节省代码
- [06-11] WebKit的基本用法
推荐内容
最近更新
- [07-27] Xcode 4 新特性介绍
- [07-23] UTF-8 和 GBK 的 NSString 相互转化的方法
- [07-09] NSSlider控件出现残像的解决方法
- [07-07] 调用系统现成importer来获取文件metadata的方法
- [06-30] 实现鼠标拖拽删除对象时烟雾缭绕效果的代码
- [06-28] QuickLook 调用示例代码
- [06-22] Cocoa里的字符串,NSString介绍
- [06-22] Cocoa里参数传递引用的方法
- [06-21] 在 xcode中进行条件编译的方法

XCode自带Source Control Manager(SCM)以及SnapShots用法
XCode、Cocoa开发中使用第三方dylib的方法
[系统控件重绘教程(二)]重绘NSButton
创建Xcode自定义模板的图文教程
在Cocoa中使用TagLib获取歌曲ID3信息
iLife 08风格的Source List代码