什么是UpdateSystemActivity的Cocoa等价物?

时间:2009-08-24 21:13:23

标签: cocoa macos power-management

我正在将Carbon应用转换为Cocoa应用,我无法找到Cocoa的等价物:

UpdateSystemActivity(UsrActivity);

那里的任何Mac人都在关注我指向正确的方向吗?感谢。

更新:我正在构建64位。构建32位工作正常,但是当我为64位构建时,我在UpdateSystemActivity(和其他)的范围错误中没有声明符号。

UPDATE2 :我正在导入以下内容:

#import <Cocoa/Cocoa.h>
#import <Carbon/Carbon.h>
#import <OpenGL/CGLMacro.h>

构建64位时还需要导入一些其他东西吗?

UPDATE3 :添加#import <CoreServices/CoreServices.h>没有帮助。我仍然遇到编译器错误,告诉我在此范围内未声明UpdateSystemActivity和UsrActivity。

UPDATE4 :好的,在OSServices / Power.h上找不到文件。我正在构建10.5 SDK并快速搜索显示:

$ pwd
/Developer/SDKs
$ find . -name Power.h
./MacOSX10.3.9.sdk/Developer/Headers/CFMCarbon/OSServices/Power.h
./MacOSX10.3.9.sdk/Developer/Headers/CFMCarbon/Power.h
./MacOSX10.3.9.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.3.9.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

./MacOSX10.4u.sdk/Developer/Headers/CFMCarbon/OSServices/Power.h
./MacOSX10.4u.sdk/Developer/Headers/CFMCarbon/Power.h
./MacOSX10.4u.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.4u.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

./MacOSX10.5.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

但我得到了:

Mac.mm:6:29: error: OSServices/Power.h: No such file or directory
Mac.mm:6:29: error: OSServices/Power.h: No such file or directory

3 个答案:

答案 0 :(得分:4)

在OS X 10.6及更高版本中,IOKit可用于禁用睡眠。当你想要禁用睡眠时创建一个IOPMAssertion,并在你想再次允许睡眠时将其销毁。

#import <IOKit/pwr_mgt/IOPMLib.h>

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep
// reasonForActivity is a descriptive string why sleep is disabled

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.
}

更多信息:https://developer.apple.com/library/mac/qa/qa1340/_index.html

答案 1 :(得分:2)

如果定义了__LP64__,此处的问题似乎是OSServices.h中排除Power.h的行。在10.5 UpdateSystemActivity上构建64位确实未定义。

好消息是符号确实存在于CoreServices.framework中。有两种方法可以访问它。

  1. 转发声明:extern“C”OSErr UpdateSystemActivity(UInt8);
  2. 明确包含您尝试过的Power.h。您尝试的问题是OSServices /找不到它进入搜索路径的方式。您可以像这样包含它:#import&lt; /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/OSServices.framework/Headers/Power.h>
  3. 我没有SnowLeopard的副本,但接下来要做的就是检查它是否固定在那里。如果不是,请提交RADAR,因为这显然是一个SDK错误。

答案 2 :(得分:1)

您仍然可以在Cocoa应用程序中调用UpdateSystemActivity - 它尚未被标记为已弃用。

API的文档指定导入CoreServices/CoreServices.h以获取API - 但是通过标题搜索(特别是在OSServices/OSServices.h中)表明该文件在64位环境中被省略。尽管如此,有Power.h(其中UpdateSystemActivity已定义)的部分已关闭64位,而UpdateSystemActivity不是其中之一。

鉴于此,请直接尝试#import <OSServices/Power.h>,看看是否有效。 (您必须在项目中包含CoreServices框架,以便找到标题。)