NSTimer中的代码可防止自动睡眠

时间:2009-03-31 16:58:11

标签: cocoa macos sleep

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

我担心干扰自动睡眠。在测试中,计时器和睡眠时间的某些组合完全阻止自动睡眠 - 显示器休眠,系统继续运行。将我的NSTimer设置为一分钟始终会将其停止。

某些Mac应用程序因运行时干扰自动睡眠而臭名昭着(或者一直安装守护进程)。什么操作会阻止系统进入睡眠状态?如何安全地运行定期任务?

4 个答案:

答案 0 :(得分:2)

根据Apple的文章“Mac OS X: Why your Mac might not sleep or stay in sleep mode”,访问磁盘会阻止您的计算机休眠。

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

@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调用将阻止计算机休眠。

答案 1 :(得分:2)

NSLog(),至少在登录/var/log/system.log时,可以防止空闲睡眠。我测试了一个每分钟调用NSLog(@"test")并且系统睡眠空闲时间为1分钟的launchd守护进程,系统从未进入睡眠状态。通过评论该NSLog线路,系统在1分钟后进入休眠状态。

以下是我发现遇到此问题的其他人的only reference

答案 2 :(得分:1)

我有点困惑,忍受我。 =)

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

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

答案 3 :(得分:0)

您是否考虑过launchd? http://developer.apple.com/MacOsX/launchd.html

这是操作系统用于自己服务的内容,因此我确信会考虑睡眠。