2009-11-30 72 views
1

當我在1秒的時間間隔內調用下面的函數時,它會導致Activity Monitor中的Not Responding,任何人都可以告訴我爲什麼並提出解決方案?活動監視器沒有響應

NSWorkspace* workspace = [NSWorkspace sharedWorkspace]; 

NSDictionary* currentAppInfo  = [workspace activeApplication]; 

//get the PSN of the current app 
UInt32 lowLong     = [[currentAppInfo objectForKey:@"NSApplicationProcessSerialNumberLow"] longValue]; 
UInt32 highLong     = [[currentAppInfo objectForKey:@"NSApplicationProcessSerialNumberHigh"] longValue]; 
ProcessSerialNumber currentAppPSN = {highLong,lowLong}; 


//grab window information from the window server 
CFArrayRef windowList    = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 
ProcessSerialNumber myPSN   = {kNoProcess, kNoProcess}; 
//loop through the windows, the window list is ordered from front to back 
for (NSMutableDictionary* entry in (NSArray*) windowList) 
{ 
    int pid = [[entry objectForKey:(id)kCGWindowOwnerPID] intValue]; 
    GetProcessForPID(pid, &myPSN); 

    //if the process of the current window in the list matches our process, get the front window number 
    if(myPSN.lowLongOfPSN == currentAppPSN.lowLongOfPSN && myPSN.highLongOfPSN == currentAppPSN.highLongOfPSN) 
    { 
     NSNumber* windowNumber = [entry objectForKey:(id)kCGWindowNumber]; 
     NSString* applicationName = [entry objectForKey:(id)kCGWindowOwnerName]; 
     NSLog(@"The current app is %@ and the window number of its front window is %@.",applicationName,windowNumber); 
     //break because we only want the front window 
     break; 
    } 
} 
CFRelease(windowList); 

回答

0

用儀器(採樣器儀器)剖析它,看看它在哪裏花費時間。

編輯

不完全知道是什麼導致它,但對於一個解決方法,你可以比較的PID,而不是連續。很容易得到你自己的PID與[[NSProcessInfo processInfo] processIdentifier]

+0

我設法追查它的GetProcessForPID(pid,&myPSN)導致它......但我怎麼能去呢? – Daniel 2009-11-30 06:35:25