2011-12-10 7 views
10

Duplicar posible:
How to programmatically prevent a Mac from going to sleep?¿Cuál es la forma correcta de evitar dormir en OS X?

¿Cuál es el método correcto de la versión actual de OS X (10.7) para impedir el sueño, mientras que una aplicación o proceso se está ejecutando?

En particular, ¿todavía sirve IOCancelPowerChange este propósito? Llamo al IOCancelPowerChange en respuesta a kIOMessageCanSystemSleep, pero eso no funciona.


En esencia, el same question como la primera parte de ésta se ha hecho antes, pero el documentation al que apunta es bastante antiguo y la respuesta nunca fue aceptado.

+2

Hay un [nuevo Q & A de Apple] (http://developer.apple.com/library/mac/#qa/qa1340/_index.html) sobre esto. –

+0

@Michael: Y me gustaría hacer lo mismo. ¿Hay alguna manera de enmendar la pregunta? – orome

+0

Publicar una recompensa aumentará la visibilidad de la pregunta y puede generar más respuestas. Haga clic en el enlace 'start a bounty' en esa pregunta y proporcione el cuadro de diálogo resultante con sus razones para querer una respuesta más actual. Agregue un comentario si desea proporcionar más detalles. –

Respuesta

9

IOCancelPowerChange sigue funcionando, pero solo para el sueño desencadenado inactivo; no funcionará para el sueño activado por el elemento del menú de reposo del Finder, solicitado por programación, o presionando el botón de encendido.

Q&A1340 de Apple responde a la pregunta "P: ¿Cómo se puede avisar a mi aplicación cuando la computadora se va a dormir o cuando se despierta? ¿Cómo evito dormir?"

Listado 2 de Q&A1340:

#import <IOKit/pwr_mgt/IOPMLib.h> 

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep, 
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep 

//reasonForActivity is a descriptive string used by the system whenever it needs 
// to tell the user why the system is not sleeping. For example, 
// "Mail Compacting Mailboxes" would be a useful string. 

// NOTE: IOPMAssertionCreateWithName limits the string to 128 characters. 
CFStringRef* reasonForActivity= CFSTR("Describe Activity Type"); 

IOPMAssertionID assertionID; 
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, 
            kIOPMAssertionLevelOn, reasonForActivity, &assertionID); 
if (success == kIOReturnSuccess) 
{ 

    //Add the work you need to do without 
    // the system sleeping here. 

    success = IOPMAssertionRelease(assertionID); 
    //The system will be able to sleep again. 
} 

Tenga en cuenta que sólo se puede detener el tiempo de inactividad del sueño, el sueño no se desencadena por el usuario.

Para las aplicaciones compatibles con Mac OS X 10.6 y posterior, utilice la nueva familia de funciones IOPMAssertion. Estas funciones permiten que otras aplicaciones y utilidades vean el deseo de su aplicación de no dormir; esto es fundamental para trabajar a la perfección con el software de administración de energía de terceros.

1

Puede llamar a updatesystemActivity (OverallAct) cada 30 segundos para evitar que la pantalla se quede dormida.

+4

Por favor, evita este truco. En su lugar, utilice las técnicas respaldadas por Apple documentadas en Q & A1340. –

+2

¿Cómo es que vino? Apple aconseja este método en un documento también. – lbrndnr

+2

La última recomendación de Apple en Q & A1340 es utilizar la nueva interfaz IOPMAssertionCreateWithName. Esta interfaz evita que su aplicación necesite ciclos de CPU cada 30 segundos, proporciona una forma simplificada para Mac OS X, y otras herramientas, para verificar las aserciones e indica mejor la intención real de sus aplicaciones. Decirle al sistema que imite la actividad del usuario cada 30 segundos es un truco que funcionó pero ahora ha sido reemplazado por una API formal. –

Cuestiones relacionadas