2011-07-22 96 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%用户,2.89%sys,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> 

的ivars:

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'之间的关系是什么?为什么用'total'来划分'inUse'会给我们带来怎样的用法呢? –