Проверить, работает ли программа по PID?Сбой GetProcessForPID - PullRequest
3 голосов
/ 08 ноября 2011

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

Сейчас я просто запускаю цикл, который проверяет это:

- (BOOL)isRunning:(int)AppPid{
    ProcessSerialNumber psn = { kNoProcess, kNoProcess };
    OSStatus err = GetProcessForPID(AppPid, &psn);
    if ( err != noErr ){
        NSLog(@"Error %d", err);
        return NO;
    }
    return YES;
}

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

Это может происходить раз в 10 минут или 5 раз подряд, это непредсказуемо.

Мой вопрос - есть ли другой простой способ через Cocoa / Objective-C определить, запущен ли процесс (который не включает в себя системную задачу, вызывающую ps, поскольку выполнение этого 50 раз в секунду не является умным)?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Есть [NSRunningApplication runningApplicationWithProcessIdentifier:].

Если вы хотите знать, когда конкретное приложение запускается и выходит, в NSWorkspace есть несколько уведомлений, которые вы можете прослушивать, в частности NSWorkspaceDidLaunchApplicationNotification и NSWorkspaceDidTerminateApplicationNotification.

Затем вы можете проверить NSWorkspaceApplicationKey словаря уведомлений userInfo, чтобы получить NSRunningApplication, который соответствует запущенному или завершенному приложению, которому вы можете сопоставить с помощью идентификатора пакета (или любого другого), чтобы определить, является ли это приложениевы заинтересованы в.

1 голос
/ 09 ноября 2011

Мой вопрос - есть ли другой простой способ через какао / Objective-C определить, запущен ли процесс (который не включает системную задачу вызывая ps, поскольку делать это 50 раз в секунду - это не умно).

Вы можете использовать пример кода Apple ( GetBSDProcessList ), кэшировать его и проверить это. Таким образом, вы получите только один вызов для списка процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...