Objective c 获取macOS上的CPU使用率百分比
我是Objective-C的初学者,我决定尝试编写一些简单的应用程序,所以我正在尝试制作一个可以测量CPU使用率等的应用程序。在Cocoa应用程序中使用Objective-C是否有一种简单的方法来获取CPU使用率等信息Objective c 获取macOS上的CPU使用率百分比,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我是Objective-C的初学者,我决定尝试编写一些简单的应用程序,所以我正在尝试制作一个可以测量CPU使用率等的应用程序。在Cocoa应用程序中使用Objective-C是否有一种简单的方法来获取CPU使用率等信息 我发现这个问题很相似,但并不完全相同。主要是,我想要整个系统的CPU使用率,而不仅仅是我的进程,我实际上更喜欢Objective-C解决方案,而在这个问题上,海报还需要其他解决方案。我的做法如下: *.h文件: #include <sys/sysctl.h> #inc
我发现这个问题很相似,但并不完全相同。主要是,我想要整个系统的CPU使用率,而不仅仅是我的进程,我实际上更喜欢Objective-C解决方案,而在这个问题上,海报还需要其他解决方案。我的做法如下: *.h文件:
#include <sys/sysctl.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/processor_info.h>
#include <mach/mach_host.h>
*.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];
}
}
-(无效)应用程序设计完成启动:(NSNotification*)通知
{
int-mib[2U]={CTL_-HW,HW_-NCPU};
size\u t sizeOfNumCPUs=sizeof(numpus);
int status=sysctl(mib,2U,&numpus,&sizeofnumcpu,NULL,0U);
如果(状态)
numpus=1;
CPUUsageLock=[[NSLock alloc]init];
updateTimer=[[NSTimer scheduledTimerWithTimeInterval:3
目标:自我
选择器:@selector(更新信息:)
用户信息:无
重复:是]保留];
}
-(void)updateInfo:(NSTimer*)计时器
{
自然数=0U;
kern\u return\u t err=host\u processor\u info(mach\u host\u self()、processor\u CPU\u LOAD\u info、&numpusu、&cpuInfo、&numpunfo);
if(err==KERN_SUCCESS){
[CPUUSAGE lock];
用于(无符号i=0U;i
Swift 4相当于VenoMKO答案。用法:让myUsage=MyCpuUsage()
开始用法观察。使用Xcode 10.0进行测试
import Foundation
// CPU usage credit VenoMKO: https://stackoverflow.com/a/6795612/1033581
class MyCpuUsage {
var cpuInfo: processor_info_array_t!
var prevCpuInfo: processor_info_array_t?
var numCpuInfo: mach_msg_type_number_t = 0
var numPrevCpuInfo: mach_msg_type_number_t = 0
var numCPUs: uint = 0
var updateTimer: Timer!
let CPUUsageLock: NSLock = NSLock()
init() {
let mibKeys: [Int32] = [ CTL_HW, HW_NCPU ]
// sysctl Swift usage credit Matt Gallagher: https://github.com/mattgallagher/CwlUtils/blob/master/Sources/CwlUtils/CwlSysctl.swift
mibKeys.withUnsafeBufferPointer() { mib in
var sizeOfNumCPUs: size_t = MemoryLayout<uint>.size
let status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0)
if status != 0 {
numCPUs = 1
}
updateTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(updateInfo), userInfo: nil, repeats: true)
}
}
@objc func updateInfo(_ timer: Timer) {
var numCPUsU: natural_t = 0
let err: kern_return_t = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo);
if err == KERN_SUCCESS {
CPUUsageLock.lock()
for i in 0 ..< Int32(numCPUs) {
var inUse: Int32
var total: Int32
if let prevCpuInfo = prevCpuInfo {
inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
total = inUse + (cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)])
} else {
inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
total = inUse + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]
}
print(String(format: "Core: %u Usage: %f", i, Float(inUse) / Float(total)))
}
CPUUsageLock.unlock()
if let prevCpuInfo = prevCpuInfo {
// vm_deallocate Swift usage credit rsfinn: https://stackoverflow.com/a/48630296/1033581
let prevCpuInfoSize: size_t = MemoryLayout<integer_t>.stride * Int(numPrevCpuInfo)
vm_deallocate(mach_task_self_, vm_address_t(bitPattern: prevCpuInfo), vm_size_t(prevCpuInfoSize))
}
prevCpuInfo = cpuInfo
numPrevCpuInfo = numCpuInfo
cpuInfo = nil
numCpuInfo = 0
} else {
print("Error!")
}
}
}
<代码>导入基础
//CPU使用率:https://stackoverflow.com/a/6795612/1033581
类MyCpuUsage{
变量cpuInfo:处理器信息数组!
var prevCpuInfo:处理器信息数组?
变量numpuinfo:mach\u msg\u type\u number\u t=0
变量numPrevCpuInfo:mach\u msg\u type\u number\u t=0
变量numpus:uint=0
var UpdateTime:计时器!
让CPUUsageLock:NSLock=NSLock()
init(){
let mibKeys:[Int32]=[CTL_-HW,HW_-NCPU]
//sysctl Swift使用信用证Matt Gallagher:https://github.com/mattgallagher/CwlUtils/blob/master/Sources/CwlUtils/CwlSysctl.swift
mibKeys.withUnsafeBufferPointer(){mib in
var sizeOfNumCPUs:size\u t=MemoryLayout.size
让status=sysctl(处理器信息数组(变异:mib.baseAddress),2,&numpus,&sizeOfNumCPUs,nil,0)
如果状态!=0{
numpus=1
}
updateTimer=Timer.scheduledTimer(时间间隔:3,目标:self,选择器:#选择器(updateInfo),用户信息:nil,重复:true)
}
}
@objc func updateInfo(uTimer:timer){
变量numpusu:natural\u t=0
let err:kern\u return\u t=host\u processor\u info(mach\u host\u self(),processor\u CPU\u LOAD\u info,&numpusu,&cpuInfo,&numpunfo);
如果err==KERN\u SUCCESS{
CPUUsageLock.lock()
对于0中的i..import Foundation
// CPU usage credit VenoMKO: https://stackoverflow.com/a/6795612/1033581
class MyCpuUsage {
var cpuInfo: processor_info_array_t!
var prevCpuInfo: processor_info_array_t?
var numCpuInfo: mach_msg_type_number_t = 0
var numPrevCpuInfo: mach_msg_type_number_t = 0
var numCPUs: uint = 0
var updateTimer: Timer!
let CPUUsageLock: NSLock = NSLock()
init() {
let mibKeys: [Int32] = [ CTL_HW, HW_NCPU ]
// sysctl Swift usage credit Matt Gallagher: https://github.com/mattgallagher/CwlUtils/blob/master/Sources/CwlUtils/CwlSysctl.swift
mibKeys.withUnsafeBufferPointer() { mib in
var sizeOfNumCPUs: size_t = MemoryLayout<uint>.size
let status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0)
if status != 0 {
numCPUs = 1
}
updateTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(updateInfo), userInfo: nil, repeats: true)
}
}
@objc func updateInfo(_ timer: Timer) {
var numCPUsU: natural_t = 0
let err: kern_return_t = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo);
if err == KERN_SUCCESS {
CPUUsageLock.lock()
for i in 0 ..< Int32(numCPUs) {
var inUse: Int32
var total: Int32
if let prevCpuInfo = prevCpuInfo {
inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
total = inUse + (cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]
- prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)])
} else {
inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)]
+ cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)]
total = inUse + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]
}
print(String(format: "Core: %u Usage: %f", i, Float(inUse) / Float(total)))
}
CPUUsageLock.unlock()
if let prevCpuInfo = prevCpuInfo {
// vm_deallocate Swift usage credit rsfinn: https://stackoverflow.com/a/48630296/1033581
let prevCpuInfoSize: size_t = MemoryLayout<integer_t>.stride * Int(numPrevCpuInfo)
vm_deallocate(mach_task_self_, vm_address_t(bitPattern: prevCpuInfo), vm_size_t(prevCpuInfoSize))
}
prevCpuInfo = cpuInfo
numPrevCpuInfo = numCpuInfo
cpuInfo = nil
numCpuInfo = 0
} else {
print("Error!")
}
}
}