2011-12-10 9 views
10

Eventuali duplicati:
How to programmatically prevent a Mac from going to sleep?Qual è il modo corretto per evitare di dormire su OS X?

Qual è il metodo corretto sulla versione corrente di OS X (10.7) per impedire il sonno mentre un'applicazione o un processo è in esecuzione?

In particolare, è IOCancelPowerChange ancora (o lo è mai stato) servire a questo scopo? Chiamo IOCancelPowerChange in risposta a kIOMessageCanSystemSleep, ma questo non fa il trucco.


Essenzialmente il same question come la prima parte di questo è stato chiesto prima, ma la documentation cui punta è piuttosto vecchio e la risposta non è mai stato accettato.

+2

C'è una [nuova Apple Q & A] (http://developer.apple.com/library/mac/#qa/qa1340/_index.html) su questo. –

+0

@ Michael: E mi piacerebbe fare lo stesso. C'è un modo per modificare la domanda? – orome

+0

Pubblicare una taglia aumenterà la visibilità della domanda e potrebbe richiedere più risposte. Fare clic sul collegamento "Avvia una taglia" su quella domanda e fornire la finestra di dialogo risultante con i motivi per cui si desidera una risposta più attuale. Aggiungi un commento se desideri fornire maggiori dettagli. –

risposta

9

IOCancelPowerChange continua a funzionare ma solo per il sonno con attivazione inattiva; non funzionerà per il sonno attivato dalla voce di menu Sleep del Finder, richiesta a livello di programmazione o da una semplice pressione del pulsante di accensione.

Q&A1340 di Apple risponde alla domanda "D: In che modo la mia applicazione può ricevere una notifica quando il computer è inattivo o si sta svegliando dal sonno? Come si impedisce il sonno?"

Listing 2 di 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. 
} 

Si noti che si può fermare solo dormire tempo di inattività, non dormono attivato dall'utente.

Per le applicazioni che supportano Mac OS X 10.6 e versioni successive, utilizzare la nuova famiglia di funzioni IOPMAssertion. Queste funzioni consentono ad altre applicazioni e utilità di vedere il desiderio della tua applicazione di non dormire; questo è fondamentale per lavorare senza problemi con il software di gestione dell'alimentazione di terze parti.

1

È possibile chiamare updateystemActivity (OverallAct) ogni 30 secondi per impedire la visualizzazione del display.

+4

Si prega di evitare questo trucco. Usa invece le tecniche approvate da Apple documentate in Q & A1340. –

+2

Come mai? Apple consiglia questo metodo anche in un documento. – lbrndnr

+2

L'ultimo consiglio di Apple in Q & A1340 è quello di utilizzare la nuova interfaccia IOPMAssertionCreateWithName. Questa interfaccia evita che l'applicazione debba richiedere cicli della CPU ogni 30 secondi, fornisce un modo semplificato per Mac OS X e altri strumenti per verificare le asserzioni e indica meglio le reali intenzioni delle applicazioni. Dire al sistema di imitare l'attività dell'utente ogni 30 secondi è un trucco che ha funzionato, ma ora è stato sostituito da un'API formale. –

Problemi correlati