1

スクリーンセーバーが実行されているかどうかを確認する際に、無限の問題が発生しています。withを使用するNSTaskps、多くのユーザーでクラッシュまたはハングします。通知を使用すると、他の人にはむらがあるようです。

なぜこれ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);
}
4

1 に答える 1

1

スクリーン セーバーが実行されているかどうかを知りたいという上位レベルの目的は何ですか? それを達成するためのより良い方法があるかもしれません。

クラッシュまたはハングを診断しようとしている場合は、クラッシュまたはハング レポートを表示します。

とにかく、このためにサブプロセスを生成する場合は、おそらくkillall -0 ScreenSaverEngine代わりに. を使用する必要がありpsます。 killall名前でプロセスを見つけます。シグナル 0 ( -0) を使用することは、「プロセスの存在をテストするだけで、実際にシグナルを送信しない」ことを意味します。[task setStandardError:[NSFileHandle fileHandleWithNullDevice]]その出力がどこにも行かないようにするために実行します。タスクの終了後にタスクの成功または失敗のステータスを調べることで、プロセスが存在したかどうかを判断します。

于 2013-01-28T23:43:47.420 に答える