2011-12-10 18 views
10

thể trùng lặp:
How to programmatically prevent a Mac from going to sleep?Cách chính xác để tránh ngủ trên OS X là gì?

phương pháp chính xác về phiên bản hiện tại của OS X (10.7) để ngăn ngừa giấc ngủ trong khi một ứng dụng hoặc quá trình đang chạy là gì?

Cụ thể, là IOCancelPowerChange vẫn (hoặc đã từng làm) phục vụ mục đích này? Tôi gọi số IOCancelPowerChange để trả lời kIOMessageCanSystemSleep, nhưng điều đó không thực hiện được.


Về cơ bản các same question như phần đầu của một điều này đã được hỏi trước, nhưng documentation nó trỏ tới là khá cũ và câu trả lời không bao giờ được chấp nhận.

+2

Có [Apple Q & A mới] (http://developer.apple.com/library/mac/#qa/qa1340/_index.html) về vấn đề này. –

+0

@Michael: Và tôi cũng muốn làm như vậy. Có cách nào tôi có thể sửa đổi câu hỏi không? – orome

+0

Đăng một tiền thưởng sẽ tăng khả năng hiển thị của câu hỏi đó và có thể nhắc thêm câu trả lời. Nhấp vào liên kết 'bắt đầu một bounty' trên câu hỏi đó và cung cấp hộp thoại kết quả với các lý do của bạn để muốn có câu trả lời hiện tại hơn. Thêm nhận xét nếu bạn muốn cung cấp thêm chi tiết. –

Trả lời

9

IOCancelPowerChange tiếp tục hoạt động nhưng chỉ cho chế độ nghỉ được kích hoạt không hoạt động; nó sẽ không hoạt động cho giấc ngủ được kích hoạt bởi mục trình đơn Ngủ của Người tìm kiếm, được yêu cầu theo lập trình hoặc từ một nút bấm nguồn.

Apple Q&A1340 trả lời câu hỏi "H: Làm cách nào để ứng dụng của tôi được thông báo khi máy tính chuyển sang chế độ ngủ hoặc thức giấc? Làm cách nào để ngăn chặn giấc ngủ?"

Liệt kê 2 của 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. 
} 

Lưu ý rằng bạn chỉ có thể dừng lại nhàn rỗi thời gian ngủ, không ngủ gây ra bởi người sử dụng.

Đối với các ứng dụng hỗ trợ Mac OS X 10.6 trở lên, hãy sử dụng mới IOPMAssertion họat động chức năng. Các chức năng này cho phép các ứng dụng và tiện ích khác thấy được mong muốn của ứng dụng không ngủ; điều này rất quan trọng để làm việc liên tục với phần mềm quản lý năng lượng của bên thứ ba.

1

Bạn có thể gọi updatesystemActivity (OverallAct) sau mỗi 30 giây để ngăn màn hình không ngủ được.

+4

Hãy tránh thủ thuật này. Thay vào đó, hãy sử dụng các kỹ thuật xác nhận của Apple được ghi trong Q & A1340. –

+2

Bằng cách nào? Apple cũng tư vấn phương pháp này trong một tài liệu. – lbrndnr

+2

Khuyến nghị mới nhất của Apple trong Q & A1340 là sử dụng giao diện IOPMAssertionCreateWithName mới. Giao diện này tránh ứng dụng của bạn cần yêu cầu chu kỳ CPU cứ sau 30 giây, nó cung cấp một cách đơn giản cho Mac OS X - và các công cụ khác - để kiểm tra xác nhận, và tốt hơn cho biết ứng dụng của bạn thực sự có ý định. Nói cho hệ thống bắt chước hoạt động của người dùng sau mỗi 30 giây là một thủ thuật đã hoạt động nhưng giờ đây đã bị thay thế bởi một API chính thức. –

Các vấn đề liên quan