我的应用程序中运行了NSTimer
,它会收集一些数据并定期发送到服务器。在生产中,计时器将每隔几个小时启动一次。
我担心干扰自动睡眠。在测试中,计时器和睡眠时间的某些组合完全阻止自动睡眠 - 显示器休眠,系统继续运行。将我的NSTimer
设置为一分钟始终会将其停止。
某些Mac应用程序因运行时干扰自动睡眠而臭名昭着(或者一直安装守护进程)。什么操作会阻止系统进入睡眠状态?如何安全地运行定期任务?
答案 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
这是操作系统用于自己服务的内容,因此我确信会考虑睡眠。