2012-10-15 7 views
6

C'è un modo per ottenere l'utilizzo della cpu per ogni processo utilizzando sysctl()?Utilizzo CPU cpu per ogni processo che utilizza sysctl()?

Sto cercando un modo per rilevare l'avvio di un'applicazione specifica. Sembra che non ci sia modo di ottenere in primo piano informazioni sull'app in esecuzione. Quindi credo che se posso monitorare l'utilizzo della cpu per quella app specifica posso monitorare le modifiche all'utilizzo della cpu e assumere approssimativamente quando l'app si avvia. Ciò è effettivamente possibile?

Non ho intenzione di pubblicare questa app su Apple Appstore.

Questa è solo una ricerca. Quindi, se c'è QUALSIASI modo di farlo, sono contento di sapere.

+0

I ha pubblicato una risposta. ti ha aiutato? – Ankit

risposta

5

Passare attraverso la seguente procedura 1. Importare file seguenti

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

2. Aggiungi ivars

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

3.IN di file .m

-(void)voidDidLoad 
{ 
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

Ciao Ankit, grazie mille per la risposta. Ma non riuscivo ancora a capire un modo per ottenere l'utilizzo della CPU dall'ID di processo. se si dispone di un frammento di codice di esempio sarebbe estremamente utile. grazie! – sleepwalkerfx

+0

La modifica è stata effettuata nella risposta con il codice ... – Ankit

+1

Ciao grazie mille per la risposta. Tuttavia, questo codice registra l'utilizzo della CPU per ciascun processo? Mi piacerebbe conoscere l'utilizzo della cpu per l'applicazione 'Youtube' o 'Camera' passando i loro PID ad una funzione. Se puoi darmi un indizio è molto apprezzato. – sleepwalkerfx