8

NSTimer在我的应用程序中运行,它收集一些数据并定期将其发送到服务器。在生产中,计时器将每隔几个小时触发一次。

我担心干扰自动睡眠。在测试中,定时器和睡眠时间的某些组合完全阻止了自动睡眠——显示器睡眠,系统继续运行。将 my 设置NSTimer为一分钟总是会停止它。

一些 Mac 应用程序因在运行时干扰自动睡眠而臭名昭著(或者一直干扰,如果它们安装了守护程序)。哪些操作可以阻止系统休眠以及如何安全地运行定期任务?

4

4 回答 4

3

NSLog(),至少在登录到时/var/log/system.log,可以防止空闲睡眠。我使用每分钟调用一次的启动守护程序进行测试,NSLog(@"test")系统睡眠空闲时间为 1 分钟,系统从未进入睡眠状态。通过注释掉 NSLog 行,系统在 1 分钟后进入睡眠状态。

这是我找到的其他遇到此问题的人的唯一参考。

于 2011-08-11T17:05:09.383 回答
2

根据 Apple 的文章“ Mac OS X:为什么您的 Mac 可能无法睡眠或保持睡眠模式”,访问磁盘将阻止您的计算机进入睡眠状态。

此外,我的测试表明,线程的优先级也会影响计算机是否会休眠。以下带有计时器的代码将允许计算机进入睡眠状态。

@implementation AppController

-(void)timerFired:(NSTimer *)aTimer
{

}

-(void)spawnThread
{
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   [NSThread setThreadPriority:0.0];

   [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];

   while(1) //Run forever!
   {
      [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:300]];
   }

   [pool drain];
}

-(void)awakeFromNib
{
   [NSThread detachNewThreadSelector:@selector(spawnThread) toTarget:self withObject:nil];
}

@end

删除 setThreadPriority 调用将阻止计算机进入睡眠状态。

于 2009-05-15T17:48:50.633 回答
1

我有点困惑,请耐心等待。=)

您的应用程序的活动将重置机器的睡眠计时器,因此除非传输之间的延迟大于不活动时间,否则机器将不会进入睡眠状态。我不完全确定在 OS X 上将什么归类为“活动”,但如果它与 Linux 类似,我希望网络或磁盘 IO 将与处于运行状态的进程一样计算 - 也就是说,处理数字或混洗数据在内存中。

此外,如果系统确实进入睡眠状态,您是否希望机器唤醒以便您的应用程序可以与远程主机通信?

于 2009-04-03T04:06:59.657 回答
0

你看过launchd吗?http://developer.apple.com/MacOsX/launchd.html

这是操作系统用于其自身服务的内容,因此我确信睡眠已被考虑在内。

于 2009-04-02T03:21:34.320 回答