2009-03-31 3 views
7

NSTimer은 일부 데이터를 수집하고 주기적으로 서버로 보내는 내 응용 프로그램에서 실행 중입니다. 프로덕션에서는 타이머가 몇 시간마다 작동합니다.NSTimer의 코드가 자동 잠자기를 방지합니다.

자동 수면 방해가 걱정됩니다. 테스트에서 타이머와 수면 시간의 일부 조합은 자동 수면을 완전히 방지합니다. 디스플레이가 잠자기 상태 일 때 시스템이 계속 실행됩니다. 내 NSTimer을 1 분으로 설정하면 항상 중지됩니다.

일부 Mac 응용 프로그램은 자동 실행을 방해 할 때 악명이 높습니다 (또는 항상 데몬을 설치하는 경우). 어떤 작업을 통해 시스템이 잠자기 상태가되는 것을 막을 수 있으며 정기적 인 작업을 안전하게 실행할 수 있습니까?

+0

응용 프로그램은 설치되어 있지만 작동하지 않는 경우 절전을 방해하지 않습니다. 코드는 무엇이든 실행해야합니다. –

+0

login, startup 또는 launchd에 의한 요청시 실행되는 도우미가있는 응용 프로그램은 설치된 것으로 간주 될 수 있습니다. 실행중인 응용 프로그램 (이 컨텍스트에서)은 현재 사용자의 세션에 존재합니다. 나는 더 구체적 이어야만했다. – s4y

답변

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 호출을 제거하면 컴퓨터가 잠자기 상태가되지 않습니다.

0

당신은 발사를 들여다 보았습니까? http://developer.apple.com/MacOsX/launchd.html

OS가 자체 서비스에 사용하는 것이므로 잠을 잘 수 있습니다.

+0

저는 launchd를 실제로 보았습니다. 그러나 프로세스가 이미 실행 중이고 launchd 작업을 설치하거나 모든 것을 주기적으로 개별 실행 파일에 포함시키지 않으려 고합니다. – s4y

1

나는 조금 혼란스러워, 나와 곰. =)

응용 프로그램의 활동은 컴퓨터의 절전 타이머를 재설정하므로 전송 간격이 비활성 기간보다 길지 않으면 컴퓨터가 절전 모드로 전환되지 않습니다. 나는 OS X에서 "활동"으로 분류되는 것이 무엇인지 완전히 모르겠다. 그러나 리눅스와 같은 것이라면 네트워크 나 디스크 IO가 실행 상태에서의 프로세스처럼 계산 될 것이라고 기대한다. 즉, 수치를 계산하거나 데이터를 주변에 배치한다. RAM에.

또한 시스템이 잠자기 상태가 된 경우 시스템이 깨어나서 앱이 원격 호스트와 대화 할 수있을 것으로 기대합니까?

+0

걱정할 필요가 없습니다. 나는 Mac OS X이 잠자기 방지 활동으로 간주하는 것을 모른다. 그리고 그것은 내 질문의 절반이다. 자동 잠자기를 방지하지 않고 디스크 및 네트워크 *에 액세스 할 수 있기를 원합니다. 기대하지 않거나 컴퓨터를 깨우고 싶지 않을 때까지 내 앱은 사용자가 기다릴 때까지 기다려야합니다. – s4y

2

NSLog() 적어도 적어도 /var/log/system.log에 로깅 할 때 유휴 상태를 방지 할 수 있습니다. 필자는 분당 NSLog(@"test")을 호출하고 1 분 동안 시스템 절전 유휴 시간을 가지는 launchd 데몬으로 테스트했는데 시스템은 절대로 절전 모드에 들어 가지 않았습니다. NSLog 라인을 주석 처리하여 1 분 후에 시스템이 잠자기 상태가되었습니다.

여기에 only reference이이 문제를 겪고있는 다른 누군가에게 있습니다.

관련 문제