2011-11-08 44 views
3

所以我基本上只想知道何時啓動和關閉外部應用程序。驗證程序是否仍在運行PID? GetProcessForPID失敗

現在我只是運行一個循環,檢查此:

- (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次不是智能)?

回答

3

[NSRunningApplication runningApplicationWithProcessIdentifier:]

如果您想知道某個特定應用程序啓動和退出的時間,您可以聽到有關NSWorkspace的一些通知,特別是NSWorkspaceDidLaunchApplicationNotificationNSWorkspaceDidTerminateApplicationNotification

然後,您可以檢查通知的userInfo字典的NSWorkspaceApplicationKey提取對應於發起或終止應用程序,您可以通過捆綁ID(或其他)匹配NSRunningApplication,以確定它是否是你所感興趣的應用

+0

我假設提交者希望範圍是其他進程,而不僅僅是應用程序。 –

1

我的問題 - 是否有通過可可/ Objective-C的另一種簡單的方法來 確定一個進程正在運行(不涉及一個系統任務 調用ps的,因爲這樣做50次/秒的ISN」聰明)。

你可以使用蘋果示例代碼(GetBSDProcessList),緩存它,並檢查。這樣你只能得到一個進程列表的調用。