使用beginActivityWithOptions禁用App Nap

时间:2013-10-29 23:39:02

标签: macos delphi delphi-xe2 firemonkey

我正在尝试将新的OS X 10.9(Mavericks)方法beginActivityWithOptions方法添加到FireMonkey(Delphi XE2)中的NSProcessInfo接口(TNSProcessInfo)。

该功能似乎有效。它返回一个对象,但是,它没有为应用程序禁用App Nap。我正在使用Activity Monitor的Energy选项卡来监控App Nap状态。

我已将以下代码添加到Macapi.Foundation.pas

const
  NSActivityBackground = 255;
  NSActivityIdleSystemSleepDisabled = 1048576;
  NSActivityUserInitiated = NSActivityIdleSystemSleepDisabled or 16777215;
  NSActivityLatencyCritical = 1095216660480;

type
  NSActivityOptions = UInt64;

  NSProcessInfo = interface(NSObject)
    ['{B96935F6-3809-4A49-AD4F-CBBAB0F2C961}']
    ...
    // Added following
    function beginActivityWithOptions(options: NSActivityOptions; reason: NSString): NSObject; cdecl;
    ...
  end;

我这样称呼它:

var
  obj: NSObject;
  reason: NSString;
  options: NSActivityOptions;
begin
  reason := NSSTR('...');
  options := NSActivityUserInitiated or NSActivityLatencyCritical;
  obj := TNSProcessInfo.Wrap(TNSProcessInfo.OCClass.processInfo).beginActivityWithOptions(options, reason);
end;

我尝试了各种各样的选项标志组合,并没有禁用App Nap。有任何想法吗?你看到我的实施有什么问题吗?

1 个答案:

答案 0 :(得分:1)

谢谢!我一直在研究这个与App Nap相关的问题,但是使用NSProcessInfo disableAutomaticTermination和enableAutomaticTermination没有成功。我尝试过使用beginActivityWithOptions的想法,现在它工作正常。我相信你唯一的错误就是你需要创建一个分配给类中字段的NSProcessInfo实例。你这样做的方式,当TNSProcessInfo.Wrap(TNSProcessInfo.OCClass.processInfo)超出范围时,你对活动所做的修改就会丢失。

在我的测试中,我使用

创建了一个表单
TForm46 = class(TForm)
  procedure FormCreate(Sender: TObject);
private
  ProcessInfo: NSProcessInfo;
public
end;

然后在FormCreate

procedure TForm46.FormCreate(Sender: TObject);
begin
  ProcessInfo := TNSProcessInfo.Wrap(TNSProcessInfo.OCClass.processInfo);
  ProcessInfo.beginActivityWithOptions(NSActivityUserInitiated or NSActivityLatencyCritical, NSSTR('Good Reason'));
end;

然后我将它部署到我的mac并运行它,并使用Activity Monitor对其进行监控。它看起来像预期的那样,应用程序一次在App Nap No状态下停留几个小时。

顺便说一下,通过PAServer运行应用程序似乎会愚弄整个App Nap。我必须部署然后在Mac上本地运行。