我试图将新的OSX10.9(小牛)方法beginActivityWithOptions方法添加到FireMonkey (DelphiXE2)中的NSProcessInfo接口(TNSProcessInfo)中。
这个功能似乎起作用了。它返回一个对象,但是它没有禁用应用程序的App。我正在使用活动监视器的Energy选项卡来监视App状态。
我在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。有什么想法吗?你觉得我的实现有什么问题吗?
发布于 2013-10-30 21:17:25
谢谢!我一直在处理同一个与应用程序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监视它。它似乎像预期的那样工作,应用程序一次在app无状态停留几个小时。
顺便说一句,通过PAServer运行应用程序似乎会愚弄整个应用程序。我必须部署,然后在Mac上本地运行。
发布于 2022-02-17 12:02:57
从你的帖子开始,我做这个单元是为了避免修改"Macapi.Foundation.pas“,我创建了"Macapi.Foundation.Ext.pas”
单元Macapi.Foundation.ext;
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“添加到窗体的使用中,并调用禁用应用程序午睡的过程,如下所示:
{$IFDEF MACOS}
TNSProcessInfoExt.disableAppNap('Maintain web server active');
{$ENDIF}我写了一篇关于这个论点的文章:https://synaptica.info/2022/02/17/delphi-disable-appnap-on-macosx-application/
https://stackoverflow.com/questions/19671197
复制相似问题