【问题标题】:What is the correct way to prevent sleep on OS X? [duplicate]在 OS X 上防止睡眠的正确方法是什么? [复制]
【发布时间】:2012-01-17 14:29:36
【问题描述】:

可能重复:
How to programmatically prevent a Mac from going to sleep?

当前版本的 OS X (10.7) 在应用程序或进程运行时防止睡眠的正确方法是什么?

特别是,IOCancelPowerChange 是否仍然(或曾经)用于此目的?我打电话给IOCancelPowerChange 以回应kIOMessageCanSystemSleep,但这并不能解决问题。


基本上之前有人问过same question作为这个的第一部分,但它指向的documentation已经很老了,答案从未被接受。

【问题讨论】:

  • 这里有一个new Apple Q&A。
  • @Michael:我也想做同样的事情。有什么办法可以修改问题吗?
  • 发布赏金会提高该问题的知名度,并可能会提示更多答案。单击该问题上的start a bounty 链接,并在生成的对话框中提供您想要更新答案的原因。如果您想提供更多详细信息,请添加评论。
  • @rax:任何人都可以对帖子提出编辑建议。如果您愿意,您对IOCancelPowerChange 的具体查询可能会独立存在。

标签: cocoa osx-lion


【解决方案1】:

IOCancelPowerChange 继续工作但仅用于空闲触发睡眠;它不适用于由 Finder 的“睡眠”菜单项、以编程方式请求或按下电源按钮触发的睡眠。

Apple 的 Q&A1340 回答了“问:我的应用程序如何在计算机进入睡眠状态或从睡眠状态唤醒时收到通知?如何防止睡眠?”

Q&A1340 的清单 2:

#import <IOKit/pwr_mgt/IOPMLib.h>

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep

//reasonForActivity is a descriptive string used by the system whenever it needs 
//  to tell the user why the system is not sleeping. For example, 
//  "Mail Compacting Mailboxes" would be a useful string.

//  NOTE: IOPMAssertionCreateWithName limits the string to 128 characters. 
CFStringRef* reasonForActivity= CFSTR("Describe Activity Type");

IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, 
                                    kIOPMAssertionLevelOn, reasonForActivity, &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. 
}

请注意,您只能停止空闲时间睡眠,不能停止用户触发的睡眠。

对于支持 Mac OS X 10.6 及更高版本的应用程序,请使用新的 IOPMAssertion 系列函数。这些功能允许其他应用程序和实用程序查看您的应用程序不休眠的愿望;这对于与第三方电源管理软件无缝协作至关重要。

【讨论】:

    【解决方案2】:

    您可以每 30 秒调用一次 updatesystemActivity(OverallAct) 以防止显示器休眠。

    【讨论】:

    • 请避免这个技巧。而是使用 Q&A1340 中记录的 Apple 认可的技术。
    • 怎么回事? Apple 也在文档中推荐了这种方法。
    • Apple 在 Q&A1340 中的最新建议是使用新的 IOPMAssertionCreateWithName 接口。该接口避免了您的应用程序需要每 30 秒请求一次 CPU 周期,它为 Mac OS X 和其他工具提供了一种简化的方式来检查断言,并更好地表明您的应用程序的真实意图。告诉系统每 30 秒模仿一次用户活动是一个有效的技巧,但现在已被正式的 API 取代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2011-08-01
    • 1970-01-01
    • 2012-01-19
    • 2013-10-26
    • 2012-04-21
    相关资源
    最近更新 更多