Obtenga el porcentaje de uso de CPU

Soy un principiante en Objective-C, y decidí intentar escribir una aplicación simple, así que estoy tratando de hacer una aplicación que mida el uso de la CPU y tal. ¿Existe una forma simple de obtener información, como el uso del porcentaje de CPU con Objective-C en una aplicación Cocoa?

He encontrado esta pregunta Determine Process Info Programmatically en Darwin / OSX, que es similar, pero no exactamente igual. Principalmente, quiero el uso del porcentaje de CPU de todo el sistema, no solo de mi proceso, y preferiría una solución Objective-C, mientras que en esa pregunta el póster quería algo más.

Esta es la forma en que lo hice:

* .h archivo:

 #include  #include  #include  #include  #include  

ivars:

 processor_info_array_t cpuInfo, prevCpuInfo; mach_msg_type_number_t numCpuInfo, numPrevCpuInfo; unsigned numCPUs; NSTimer *updateTimer; NSLock *CPUUsageLock; 

archivo * .m

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { int mib[2U] = { CTL_HW, HW_NCPU }; size_t sizeOfNumCPUs = sizeof(numCPUs); int status = sysctl(mib, 2U, &numCPUs, &sizeOfNumCPUs, NULL, 0U); if(status) numCPUs = 1; CPUUsageLock = [[NSLock alloc] init]; updateTimer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(updateInfo:) userInfo:nil repeats:YES] retain]; } - (void)updateInfo:(NSTimer *)timer { natural_t numCPUsU = 0U; kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo); if(err == KERN_SUCCESS) { [CPUUsageLock lock]; for(unsigned i = 0U; i < numCPUs; ++i) { float inUse, total; if(prevCpuInfo) { inUse = ( (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]) + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM]) + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]) ); total = inUse + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]); } else { inUse = cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]; total = inUse + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]; } NSLog(@"Core: %u Usage: %f",i,inUse / total); } [CPUUsageLock unlock]; if(prevCpuInfo) { size_t prevCpuInfoSize = sizeof(integer_t) * numPrevCpuInfo; vm_deallocate(mach_task_self(), (vm_address_t)prevCpuInfo, prevCpuInfoSize); } prevCpuInfo = cpuInfo; numPrevCpuInfo = numCpuInfo; cpuInfo = NULL; numCpuInfo = 0U; } else { NSLog(@"Error!"); [NSApp terminate:nil]; } }