2009-03-31 8 views
7

Tengo un NSTimer ejecutándose en mi aplicación que recopila algunos datos y los envía periódicamente a un servidor. En producción, el temporizador disparará cada pocas horas.El código en NSTimer evita el reposo automático

Me preocupa interferir con la suspensión automática. En las pruebas, algunas combinaciones de temporizador y tiempo de suspensión impiden por completo el sueño automático: la pantalla duerme, el sistema sigue funcionando. Establecer mi NSTimer en un minuto siempre lo detiene.

Algunas aplicaciones de Mac son notorias por interferir con la suspensión automática cuando se ejecutan (o todo el tiempo, si instalan un daemon). ¿Qué acciones impiden que el sistema duerma y cómo puedo ejecutar tareas periódicas de forma segura?

+0

Las aplicaciones nunca interfieren con la suspensión si están instaladas pero no se están ejecutando. El código tiene que estar ejecutándose para hacer cualquier cosa. –

+0

Se puede considerar que una aplicación que tiene un programa auxiliar ejecutándose al inicio de sesión, inicio o bajo demanda mediante launchd. Una aplicación en ejecución (en este contexto) tiene una presencia en la sesión del usuario actual. Debí haber sido más especifico. – s4y

Respuesta

2

Acceder al disco evitará que su computadora se quede dormida, según el artículo de Apple "Mac OS X: Why your Mac might not sleep or stay in sleep mode".

Además, mis pruebas han demostrado que la prioridad de un hilo también tiene un impacto en si una computadora dormirá o no. El siguiente código con un temporizador permitirá que una computadora duerma.

@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 

La eliminación de la llamada SetThreadPriority evitará que el equipo de dormir.

0

¿Has mirado en launchd? http://developer.apple.com/MacOsX/launchd.html

Es lo que el sistema operativo utiliza para sus propios servicios, por lo que estoy seguro de que se tuvo en cuenta el sueño.

+0

De hecho, he mirado launchd, pero mi proceso ya se está ejecutando y no quiero instalar un trabajo de lanzamiento, o factorizar todo periódicamente en un ejecutable separado, para el caso. – s4y

1

Estoy un poco confundido, tengan paciencia conmigo. =)

La actividad de su aplicación restablecerá el temporizador de apagado automático de la máquina, por lo tanto, a menos que la demora entre transmisiones sea mayor que el período de inactividad, la máquina no se apagará. No estoy completamente seguro de lo que se clasifica como "actividad" en OS X, pero si es algo así como Linux, espero que la red o el disco IO cuenten como lo harían los procesos en el estado en ejecución, es decir, calcular números o barajar datos alrededor en RAM

Además, en el caso de que el sistema se apagara, ¿espera que la máquina se active para que su aplicación pueda comunicarse con el host remoto?

+0

Sin preocupaciones. Tampoco sé qué Mac OS X cuenta como actividad para evitar el sueño, y esa es la mitad de mi pregunta. Deseo poder acceder al disco y a la red * sin * evitar el reposo automático. No espero o no quiero reactivar la máquina, mi aplicación está feliz de esperar hasta que el usuario lo haga. – s4y

2

NSLog(), al menos cuando se está registrando en /var/log/system.log, puede evitar la inactividad. Probé con un demonio launchd que llamaría al NSLog(@"test") por minuto y con un tiempo de inactividad del sistema inactivo de 1 minuto, y el sistema nunca se apagó. Comentando esa línea NSLog, el sistema se fue a dormir después de 1 minuto.

Aquí está el only reference Encontré a alguien más que experimenta este problema.

Cuestiones relacionadas