views:

232

answers:

1

when i'm calling the below function in a time interval of 1 second, it would cause Not Responding in Activity Monitor, anyone can tell me why and suggest a solution?

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);
A: 

profile it with instruments (sampler instrument), see where it spends its time.

Edit:

Not exactly sure what's causing it, but for a workaround, you could compare PIDs instead of serials. It's easy enough to get your own PID with [[NSProcessInfo processInfo] processIdentifier]

cobbal
Daniel