2009-03-31 12 views
7

Mam w mojej aplikacji NSTimer, który zbiera dane i przesyła je okresowo do serwera. W produkcji zegar będzie uruchamiany co kilka godzin.Kod w NSTimer zapobiega automatycznemu snu

Martwię się o zakłócanie automatycznego snu. Podczas testowania niektóre kombinacje czasu i czasu uśpienia całkowicie uniemożliwiają automatyczne zasypianie - wyświetlacz śpi, system nadal działa. Ustawienie wartości NSTimer na jedną minutę zawsze zatrzymuje.

Niektóre aplikacje dla systemu Mac są znane z zakłócania automatycznego trybu uśpienia podczas pracy (lub cały czas, jeśli instalują demona). Jakie działania powstrzymują system przed zasypianiem i jak mogę bezpiecznie wykonywać cykliczne zadania?

+0

Aplikacje nigdy nie zakłócają snu, jeśli są zainstalowane, ale nie działają. Kod musi działać, aby cokolwiek zrobić. –

+0

Aplikacja, która uruchamia helpera przy logowaniu, uruchomieniu lub na żądanie przez launchd, może być uważana za zainstalowaną. Działająca aplikacja (w tym kontekście) jest obecna w sesji bieżącego użytkownika. Powinienem być bardziej konkretny. – s4y

Odpowiedz

2

Uzyskanie dostępu do dysku uniemożliwi komputerowi zasypianie, zgodnie z artykułem Apple "Mac OS X: Why your Mac might not sleep or stay in sleep mode".

Ponadto moje testy wykazały, że priorytet wątku ma również wpływ na to, czy komputer będzie spał. Poniższy kod z licznikiem czasu pozwoli komputerowi spać.

@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 

Usunięcie wywołania setThreadPriority uniemożliwi komputerowi zasypianie.

0

Czy zapoznałeś się z launchd? http://developer.apple.com/MacOsX/launchd.html

Jest to, co OS wykorzystuje do własnych usług, więc jestem pewien, że sen został wzięty pod uwagę.

+0

Rzeczywiście patrzyłem na launchd, ale mój proces będzie już działał i nie chcę instalować uruchomionej pracy - lub czynnik okresowo na zewnątrz do oddzielnego pliku wykonywalnego, o to chodzi. – s4y

1

Jestem trochę zdezorientowany, znoś się ze mną. =)

Aktywność według aplikacji wyzeruje licznik uśpienia urządzenia, więc jeśli opóźnienie między transmisjami nie przekroczy czasu nieaktywności, urządzenie nie pójdzie spać. Nie jestem do końca pewien, co klasyfikuje jako "aktywność" w OS X, ale jeśli jest to coś podobnego do Linuksa, spodziewam się, że IO sieci lub dysku będzie liczyć się tak, jak procesy w stanie uruchomionym - to znaczy pomijanie liczb lub tasowanie danych wokół w pamięci RAM.

Również w przypadku, gdy system nie zasypiał, czy spodziewasz się, że komputer się obudzi, aby aplikacja mogła komunikować się ze zdalnym hostem?

+0

Bez obaw. Nie wiem, co to jest Mac OS X, jako działanie zapobiegające uśpieniu, a to połowa mojego pytania. Chcę mieć dostęp do dysku i sieci * bez * zapobiegania automatycznemu zasypianiu. Nie oczekuję ani nie chcę się obudzić, moja aplikacja z przyjemnością czeka, aż użytkownik to zrobi. – s4y

2

NSLog(), przynajmniej przy logowaniu do /var/log/system.log, może zapobiec bezczynności snu. Testowałem z demonem launchd, który wywoływał co minutę NSLog(@"test") i z czasem bezczynności systemu wynoszącym 1 minutę, a system nigdy nie zasypiał. Komentując, że linia NSLog, system poszedł spać po 1 minucie.

Oto only reference Znalazłem dla kogoś, kto doświadczył tego problemu.