2009-03-31 35 views
7

Tôi có một ứng dụng NSTimer chạy trong ứng dụng của tôi thu thập một số dữ liệu và gửi nó đến máy chủ định kỳ. Trong quá trình sản xuất, bộ đếm thời gian sẽ kích hoạt sau vài giờ.Mã trong NSTimer ngăn ngừa ngủ tự động

Tôi lo lắng về việc can thiệp vào giấc ngủ tự động. Trong thử nghiệm, một số kết hợp của bộ đếm thời gian và thời gian ngủ ngăn chặn giấc ngủ tự động hoàn toàn - màn hình ngủ, hệ thống tiếp tục chạy. Đặt NSTimer của tôi thành một phút luôn dừng nó.

Một số ứng dụng Mac nổi tiếng vì đã can thiệp vào chế độ ngủ tự động khi chạy (hoặc tất cả thời gian, nếu chúng cài đặt daemon). Những hành động nào khiến hệ thống ngừng hoạt động và tôi có thể chạy các tác vụ định kỳ một cách an toàn như thế nào?

+0

Ứng dụng không bao giờ can thiệp vào giấc ngủ nếu chúng được cài đặt nhưng không chạy. Mã phải chạy để làm bất cứ điều gì. –

+0

Một ứng dụng có trợ giúp chạy lúc đăng nhập, khởi động hoặc theo yêu cầu bằng launchd có thể được xem là đã cài đặt. Một ứng dụng đang chạy (trong ngữ cảnh này) có một sự hiện diện trong phiên của người dùng hiện tại. Tôi cần phải có được cụ thể hơn. – s4y

Trả lời

2

Truy cập đĩa sẽ ngăn máy tính của bạn không ngủ được, theo bài viết "Mac OS X: Why your Mac might not sleep or stay in sleep mode" của Apple.

Ngoài ra, thử nghiệm của tôi đã cho thấy rằng mức độ ưu tiên của một chuỗi cũng có tác động đến việc máy tính có ngủ hay không. Các mã sau đây với một bộ đếm thời gian sẽ cho phép một máy tính để ngủ.

@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 

Xóa tập hợpThreadPriority call sẽ ngăn máy tính ngủ.

0

Bạn đã xem bản giới thiệu chưa? http://developer.apple.com/MacOsX/launchd.html

Đó là những gì hệ điều hành sử dụng cho các dịch vụ của riêng mình, vì vậy tôi chắc chắn rằng giấc ngủ đã được xem xét.

+0

Tôi đã thực sự nhìn vào launchd, nhưng quá trình của tôi đã và đang chạy và tôi không muốn cài đặt một công việc launchd - hoặc yếu tố tất cả mọi thứ định kỳ ra thành một thực thi riêng biệt, cho rằng vấn đề. – s4y

1

Tôi hơi bối rối, chịu đựng tôi. =)

Hoạt động bằng ứng dụng của bạn sẽ đặt lại hẹn giờ ngủ của máy, vì vậy trừ khi độ trễ giữa quá trình truyền lớn hơn thời gian không hoạt động, máy sẽ không chuyển sang chế độ ngủ. Tôi không hoàn toàn chắc chắn những gì phân loại là "hoạt động" trên OS X, nhưng nếu nó là bất cứ thứ gì như Linux, tôi mong rằng mạng hoặc đĩa IO sẽ được tính là sẽ xử lý ở trạng thái đang chạy - đó là để nói số crunching hoặc xáo trộn dữ liệu xung quanh trong RAM.

Ngoài ra, trong trường hợp hệ thống đã chuyển sang chế độ ngủ, bạn có nghĩ máy sẽ thức dậy để ứng dụng của bạn có thể nói chuyện với máy chủ từ xa không?

+0

Không phải lo lắng. Tôi không biết Mac OS X được tính là hoạt động ngăn chặn giấc ngủ, và đó là một nửa câu hỏi của tôi. Tôi muốn có thể truy cập vào đĩa và mạng * mà không cần * ngăn chặn giấc ngủ tự động. Tôi không mong đợi hoặc muốn thức dậy máy, ứng dụng của tôi rất vui khi đợi cho đến khi người dùng thực hiện điều đó. – s4y

2

NSLog(), ít nhất là khi nó đang đăng nhập /var/log/system.log, có thể ngăn không hoạt động khi ngủ. Tôi đã thử nghiệm với một daemon launchd sẽ gọi NSLog(@"test") mỗi phút và với một hệ thống ngủ thời gian nhàn rỗi trong 1 phút, và hệ thống không bao giờ đi ngủ. Bằng cách bình luận ra rằng dòng NSLog, hệ thống đã đi ngủ sau 1 phút.

Đây là số only reference Tôi đã tìm thấy người khác gặp sự cố này.

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