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

该功能似乎起作用。它返回一个对象,但是,它没有为应用程序禁用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。有任何想法吗?您认为我的实施有什么问题吗?

最佳答案

谢谢!我一直在解决与该应用程序小睡相关的同一问题,但未成功使用NSProcessInfo disableAutomaticTermination和enableAutomaticTermination。我尝试了使用beginActivityWithOptions的想法,现在工作正常。我相信您唯一的错误是您需要创建一个分配给该类中的field的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”状态保持数小时,似乎可以正常工作。

顺便说一句,整个应用程序Nap的事情似乎通过PAServer运行应用程序而被愚弄了。我必须进行部署,然后在Mac上本地运行。

关于macos - 使用beginActivityWithOptions禁用App Nap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19671197/

10-12 19:02