首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用beginActivityWithOptions禁用应用程序Nap

用beginActivityWithOptions禁用应用程序Nap
EN

Stack Overflow用户
提问于 2013-10-29 23:39:01
回答 2查看 2.4K关注 0票数 3

我试图将新的OSX10.9(小牛)方法beginActivityWithOptions方法添加到FireMonkey (DelphiXE2)中的NSProcessInfo接口(TNSProcessInfo)中。

这个功能似乎起作用了。它返回一个对象,但是它没有禁用应用程序的App。我正在使用活动监视器的Energy选项卡来监视App状态。

我在Macapi.Foundation.pas中添加了以下代码

代码语言:javascript
复制
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;

我是这样说的:

代码语言:javascript
复制
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。有什么想法吗?你觉得我的实现有什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-30 21:17:25

谢谢!我一直在处理同一个与应用程序Nap相关的问题,但在使用NSProcessInfo disableAutomaticTermination和enableAutomaticTermination时没有成功。我尝试过您使用beginActivityWithOptions的想法,现在它运行良好。我认为您唯一的错误是需要创建一个分配给类中字段的NSProcessInfo实例。当TNSProcessInfo.Wrap(TNSProcessInfo.OCClass.processInfo)超出范围时,您对活动所做的修改将丢失。

在测试中,我创建了一个表单

代码语言:javascript
复制
TForm46 = class(TForm)
  procedure FormCreate(Sender: TObject);
private
  ProcessInfo: NSProcessInfo;
public
end;

然后在FormCreate里

代码语言:javascript
复制
procedure TForm46.FormCreate(Sender: TObject);
begin
  ProcessInfo := TNSProcessInfo.Wrap(TNSProcessInfo.OCClass.processInfo);
  ProcessInfo.beginActivityWithOptions(NSActivityUserInitiated or NSActivityLatencyCritical, NSSTR('Good Reason'));
end;

然后我将它部署到我的mac上并运行它,并使用Activity监视它。它似乎像预期的那样工作,应用程序一次在app无状态停留几个小时。

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

票数 3
EN

Stack Overflow用户

发布于 2022-02-17 12:02:57

从你的帖子开始,我做这个单元是为了避免修改"Macapi.Foundation.pas“,我创建了"Macapi.Foundation.Ext.pas”

单元Macapi.Foundation.ext;

代码语言:javascript
复制
interface
uses  Macapi.ObjCRuntime, Macapi.ObjectiveC, Macapi.CocoaTypes,
      Macapi.CoreFoundation, Macapi.CoreServices,Macapi.Foundation;

type

  NSProcessInfoExt = interface(NSProcessInfo)
    ['{1458E7B6-B64E-430E-8DE4-A19C680C17D3}']
    // add process begin
    // Added following
    function beginActivityWithOptions(options: NSActivityOptions; reason: NSString): NSObject; cdecl;
  end;
  TNSProcessInfoExt = class(TOCGenericImport<NSProcessInfoClass, NSProcessInfoExt>)
  public
    class procedure disableAppNap(Areason : String = 'Your reason to disable appNap');
  end;


var
  ProcessInfo: NSProcessInfoExt;

implementation

{ TNSProcessInfoExt }

class procedure TNSProcessInfoExt.disableAppNap(Areason: String = 'Your reason to disable appNap');
const
  NSActivityBackground = 255;
  NSActivityIdleSystemSleepDisabled = 1048576;
  NSActivityUserInitiated = NSActivityIdleSystemSleepDisabled or 16777215;
  NSActivityLatencyCritical = 1095216660480;

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



  ProcessInfo := TNSProcessInfoExt.Wrap(TNSProcessInfo.OCClass.processInfo);
  ProcessInfo.beginActivityWithOptions(NSActivityUserInitiated or NSActivityLatencyCritical,reason);


end;

end.

因此,当需要禁用appNap时,只需将"Macapi.Foundation.Ext.pas“添加到窗体的使用中,并调用禁用应用程序午睡的过程,如下所示:

代码语言:javascript
复制
  {$IFDEF MACOS}
    TNSProcessInfoExt.disableAppNap('Maintain web server active');
  {$ENDIF}

我写了一篇关于这个论点的文章:https://synaptica.info/2022/02/17/delphi-disable-appnap-on-macosx-application/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19671197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档