2012-10-15 18 views
6

Czy istnieje sposób na uzyskanie użycia procesora dla każdego procesu przy użyciu sysctl()?Użycie procesora iOS dla każdego procesu przy użyciu sysctl()?

Próbuję znaleźć sposób na wykrycie uruchomienia konkretnej aplikacji. Wygląda na to, że nie ma sposobu na uzyskanie nowej wiedzy na temat informacji o aplikacji. Sądzę więc, że jeśli mogę monitorować użycie procesora dla tej konkretnej aplikacji, mogę monitorować zmiany użycia procesora i z grubsza zakładam, kiedy uruchamia się aplikacja. Czy to w ogóle możliwe?

Nie planuję opublikować tej aplikacji w sklepie Apple App Store.

To tylko badania. Więc jeśli jest JAKIKOLWIEK sposób to zrobić, to jestem zadowolony.

+0

I wysłał odpowiedź. Czy to ci pomogło? – Ankit

Odpowiedz

5

przejść następującą proces importu 1. Następujące pliki

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

2. Dodaj Ivars

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

3.IN pliku .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

Cześć Ankit, dziękuję verymuch za odpowiedź. Ale nadal nie mogłem wymyślić sposób na wykorzystanie procesora przez identyfikator procesu. jeśli masz przykładowy fragment kodu, byłoby to bardzo pomocne. Dziękuję Ci! – sleepwalkerfx

+0

Edycja została wprowadzona w odpowiedzi przy pomocy kodu ... – Ankit

+1

Cześć, dziękuję bardzo za odpowiedź. Jednak czy ten dziennik kodu używa protokołu dla każdego procesu? Chciałbym poznać wykorzystanie procesora dla aplikacji "YouTube" lub aplikacji "Kamera" poprzez przekazanie ich PIDów do funkcji. Jeśli możesz dać mi wskazówkę, jest to bardzo cenne. – sleepwalkerfx

Powiązane problemy