2011-07-22 69 views
28

私はObjective-Cの初心者です。単純なアプリケーションを書くことにしました。CPU使用率などを測定するアプリを作ろうとしています。 CocoaアプリケーションでObjective-Cを使用してCPU使用率などの情報を取得する簡単な方法はありますか?CPU使用率を取得する

私はこの質問Determine Process Info Programmatically in Darwin/OSXと似ていますが、まったく同じではありません。主に、私はプロセス全体だけでなく、システム全体のCPU使用率を求めています。実際にはObjective-Cソリューションを好むでしょうが、その質問ではポスターは何か他のものを求めていました。ここで

+0

Objective Cでは認識していませんが、Objective CはCのスーパーセットであるため、['getloadavg'](http://developer.apple.com/library/mac/#documentation/Darwin /Reference/ManPages/man3/getloadavg.3.html)関数を呼び出します。 – highlycaffeinated

+0

申し訳ありませんが、質問は完全にはっきりしていませんでしたが、私が探しているのはCPU使用率を判断する方法です(CPU使用率3.62%、sys 2.89%、93.47%アイドル状態)になる。 CPU使用量を判断する良い方法はありますか? – houbysoft

+0

Swift用に更新されました。このリンクを読む:[iOS - アプリケーションからCPU使用率を得る](https://stackoverflow.com/questions/8223348/ios-get-cpu-usage-from-application) – Markus

答えて

32

私はそれをやった方法です:

* .hファイル:

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

アイバーズ:

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

* .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

btw詳細を取得するCPU使用量に関する情報(ユーザー、システムによって使用される...) – VenoMKO

+1

それはすばらしく、ありがとう! – houbysoft

+1

@VenoMKOあなたは 'host_processor_info'から得た配列について少し説明できますか?私が見る限り、それはサイズの配列です( 'core_count' *' CPU_STATE_MAX')?各コアの意味には、 'CPU_STATE_MAX'という情報があります。ここに私の質問です。 A)各価値はどのように見えるのですか? B)なぜあなたはそれを以前の値と差し引いていますか? C) 'inUse'と' total'の関係はどうですか? 'inUse'を' total'で分割すると、私たちはその使用量を得るのはなぜですか? –