2011-07-22 25 views
28

Soy un principiante en Objective-C, y decidí intentar escribir alguna aplicación simple, así que estoy tratando de hacer una aplicación que mida el uso de 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?Obtener uso de porcentaje de CPU

He encontrado esta pregunta Determine Process Info Programmatically in 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.

+0

No es algo que conozca en Objective C, pero dado que Objective C es un superconjunto de C, puede usar ['getloadavg'] (http://developer.apple.com/library/mac/#documentation/Darwin /Reference/ManPages/man3/getloadavg.3.html) función. – highlycaffeinated

+0

Disculpe, la pregunta no era del todo clara (editada un poco), pero lo que busco es más una forma de determinar la utilización de CPU% (por ejemplo, en la parte superior: 'uso de CPU: 3.62% de usuario, 2.89% de sistema, 93.47% inactivo) que promedio de carga. ¿Hay una buena forma de determinar el uso de la CPU? – houbysoft

+0

Actualizado para Swift. Lea este enlace: [iOS: obtenga uso de la CPU de la aplicación] (https://stackoverflow.com/questions/8223348/ios-get-cpu-usage-from-application) – Markus

Respuesta

32

Aquí es la forma en que lo hice:

* archivo .h:

#include <sys/sysctl.h> 
#include <sys/types.h> 
#include <mach/mach.h> 
#include <mach/processor_info.h> 
#include <mach/mach_host.h> 

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]; 
    } 
} 
+0

Por cierto, obtendrá detalles información sobre el uso de la CPU (utilizado por el usuario, el sistema ...) – VenoMKO

+1

¡Eso se ve genial, gracias! – houbysoft

+1

@VenoMKO ¿Puedes explicarnos un poco sobre la matriz que obtuviste de 'host_processor_info'? Por lo que puedo ver, es una matriz de tamaño ('core_count' *' CPU_STATE_MAX') ¿verdad? Significado para cada núcleo, hay información de 'CPU_STATE_MAX' al respecto. Aquí está mi pregunta A) ¿Cómo se ve cada valor? B) ¿Por qué lo restas del valor anterior? C) ¿Cuál es la relación entre 'inUse' y' total'? ¿Por qué dividir 'inUse' por' total' nos da el uso? –