Каков правильный способ предотвращения сна на OS X?

Возможный дубликат:
Как программно предотвратить переключение Mac на Mac?

Каков правильный метод для текущей версии OS X (10.7) для предотвращения сна во время работы приложения или процесса?

В частности, IOCancelPowerChange все еще (или сделал это когда-либо) служит этой цели? Я вызываю IOCancelPowerChange в ответ на kIOMessageCanSystemSleep, но это не делает трюк.


По существу тот же вопрос, что и первая часть этого вопроса, но документация, указывает на то, что он довольно старый, и ответ так и не был принят.

Ответ 1

IOCancelPowerChange продолжает работать, но только для режима ожидания сна; он не будет работать для сна, вызванного пунктом меню Finder Sleep, запрограммированным программным путем или нажатием кнопки питания.

Apple Q & A1340 отвечает на вопрос "Q: Как мое приложение может быть уведомлено, когда компьютер будет спать или бодрствовать сна? Как предотвратить сон??"

Листинг 2 из 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. 
}

Обратите внимание, что вы можете только остановить спящий режим, а не спать, вызванный пользователем.

Для приложений, поддерживающих Mac OS X 10.6 и более поздних версий, используйте новое семейство функций IOPMAssertion. Эти функции позволяют другим приложениям и утилитам видеть, что ваше приложение желает не спать; это имеет решающее значение для бесперебойной работы с программным обеспечением для управления питанием сторонних производителей.

Ответ 2

Вы можете вызвать updateystemActivity (TotalAct) каждые 30 секунд, чтобы предотвратить спящий дисплей.