Код в NSTimer предотвращает автоматический сон - PullRequest
7 голосов
/ 31 марта 2009

У меня в приложении работает NSTimer, который собирает некоторые данные и периодически отправляет их на сервер. В производстве таймер будет срабатывать каждые несколько часов.

Я беспокоюсь о том, чтобы мешать автоматическому сну. При тестировании некоторые комбинации таймера и времени ожидания полностью блокируют автоматический режим сна - дисплей спит, система продолжает работать. Установка моего NSTimer на одну минуту всегда останавливает его.

Некоторые приложения Mac печально известны тем, что мешают автоматическому сну при запуске (или постоянно, если они устанавливают демон). Какие действия не позволяют системе перейти в спящий режим и как безопасно выполнять периодические задачи?

Ответы [ 4 ]

2 голосов
/ 11 августа 2011

NSLog(), по крайней мере, когда он регистрируется в /var/log/system.log, может предотвратить бездействующий сон. Я протестировал с демоном launchd, который будет вызывать NSLog(@"test") каждую минуту, и с системным временем простоя в 1 минуту, и система никогда не переходила в режим сна. Комментируя эту строку NSLog, система перешла в спящий режим через 1 минуту.

Вот только ссылка Я нашел кого-то, кто столкнулся с этой проблемой.

2 голосов
/ 15 мая 2009

Доступ к диску приведет к тому, что ваш компьютер не будет спать, согласно статье 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 не даст компьютеру спать.

1 голос
/ 03 апреля 2009

Я немного сбит с толку, терпите меня. =) * * Тысяча одна

Активность вашего приложения приведет к сбросу таймера сна аппарата, поэтому, если задержка между передачами не будет больше периода бездействия, аппарат не перейдет в режим сна. Я не совсем уверен, что классифицируется как «активность» в OS X, но если это что-то похожее на Linux, я ожидаю, что сетевой или дисковый ввод-вывод будет учитываться, как процессы в рабочем состоянии, то есть сокращение чисел или перемешивание данных вокруг в оперативной памяти.

Кроме того, если система перешла в спящий режим, ожидаете ли вы, что машина выйдет из строя, и ваше приложение сможет общаться с удаленным хостом?

0 голосов
/ 02 апреля 2009

Вы смотрели в launchd? http://developer.apple.com/MacOsX/launchd.html

Это то, что ОС использует для своих собственных служб, поэтому я уверен, что сон был принят во внимание.

...