スクリーンセーバーが実行されているかどうかを確認する際に、無限の問題が発生しています。withを使用するNSTask
とps
、多くのユーザーでクラッシュまたはハングします。通知を使用すると、他の人にはむらがあるようです。
なぜこれNSTask
が薄っぺらなのかについてのアイデアはありますか?(はい、デバッグしているので、今のところ厄介だと思います)
-(BOOL)checkScreenSaverRunning
{
MYLog(@"Building task to check screen saver running");
BOOL foundSaver=FALSE;
NSTask *task;
int i;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/ps"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-ax", nil];
[task setArguments: arguments];
NSPipe *stdpipe;
stdpipe = [NSPipe pipe];
[task setStandardOutput: stdpipe];
NSFileHandle *stdfile;
stdfile = [stdpipe fileHandleForReading];
MYLog(@"Launching task to check screen saver running");
[task launch];
while ([task isRunning]){
NSData *stddata;
stddata = [stdfile readDataToEndOfFile];
if([stddata length]>0){
NSString *stdstring = [[NSString alloc] initWithData:stddata
encoding:NSUTF8StringEncoding];
NSArray *stdReturnValues=[stdstring componentsSeparatedByString:@"\n"];
for(i=0;i<[stdReturnValues count];i++){
if([[stdReturnValues objectAtIndex:i]
rangeOfString:@"ScreenSaverEngine"].location != NSNotFound){
foundSaver=TRUE;
MYLog(@"Found screensaver in running processes");
}
}
[stdstring release];
stdstring=nil;
}
}
MYLog(@"Task ended");
[task release];
if(foundSaver)screenSaverIsActive=TRUE;
else screenSaverIsActive=FALSE;
return(foundSaver);
}