2012-10-15 4 views
6

Gibt es eine Möglichkeit, CPU-Nutzung für jeden Prozess mit sysctl() zu bekommen?iOS CPU-Nutzung für jeden Prozess mit sysctl()?

Ich versuche einen Weg zu finden, den Start einer bestimmten Anwendung zu erkennen. Es scheint, dass es keine Möglichkeit gibt, im Vordergrund laufende App-Informationen zu erhalten. Ich denke also, wenn ich die CPU-Nutzung für diese bestimmte App überwachen kann, kann ich die CPU-Nutzungsänderungen überwachen und grob davon ausgehen, dass die App startet. Ist das überhaupt möglich?

Ich plane nicht, diese App in Apple Appstore zu veröffentlichen.

Dies ist nur eine Recherche. Also, wenn es irgendeinen Weg gibt, dies zu tun, bin ich froh zu wissen.

+0

I hat eine Antwort geschrieben. Hat dir das geholfen? – Ankit

Antwort

5

Gehen Sie durch den folgenden Prozess 1. Dateien importieren Folgende

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

2. ivars hinzufügen

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

3.IN .m-Datei

-(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

Hallo Ankit, vielen Dank für die Antwort. Aber ich konnte immer noch keinen Weg finden, die CPU-Nutzung durch die Prozess-ID zu bekommen. Wenn Sie ein Beispielcode-Snippet haben, wäre es sehr hilfreich. Danke! – sleepwalkerfx

+0

Bearbeiten wurde in der Antwort mit dem Code gemacht ... – Ankit

+1

Hallo vielen Dank für die Antwort. Wird jedoch bei diesem Code die CPU-Nutzung für jeden Prozess protokolliert? Ich würde gerne die CPU-Nutzung für "Youtube" -Anwendung oder "Kamera" -Anwendung wissen, indem Sie ihre PIDs an eine Funktion übergeben. Wenn Sie mir einen Hinweis geben können, wird es sehr geschätzt. – sleepwalkerfx

Verwandte Themen