请教下:C语言获取计算机系统CPU使用率,内存使用情况的思路或流程是怎样的?!

网上很多代码雷同,大多不能正确运行,第一次编写有些地方还看不懂,因作业里面用到,请高手赐教,有代码发我下!非常感谢!... 网上很多代码雷同,大多不能正确运行,第一次编写有些地方还看不懂,因作业里面用到,请高手赐教,有代码发我下!非常感谢! 展开
 我来答
zhccsd
推荐于2018-05-13 · TA获得超过4042个赞
知道大有可为答主
回答量:1347
采纳率:66%
帮助的人:914万
展开全部
内存情况比较简单
MEMORYSTATUSEX mstx;
mstx.dwLength = sizeof (mstx);
GlobalMemoryStatusEx( &mstx );

int iMemeryUsePercentage = mstx.dwMemoryLoad;
int iTotalPhysMB = mstx.ullTotalPhys/1024/1024;
int iAvailPhysMB = mstx.ullAvailPhys/1024/1024;
int iTotalPageFileMB = mstx.ullTotalPageFile/1024/1024;
int iAvailPageFileMB = mstx.ullAvailPageFile/1024/1024;

char LogBuff[128];
memset( LogBuff , 0 , 128 );
sprintf( LogBuff , "MemAvailPct=%d%% Phys=%d/%d PageFile=%d/%d" , 100 - iMemeryUsePercentage , iAvailPhysMB , iTotalPhysMB , iAvailPageFileMB , iTotalPageFileMB );
printf("%s\n",LogBuff);
以上程序分别输出可用百分比,可以用物理内存/总物理内存,可用页面文件/总页面文件

获取CPU的比较复杂,我这边只有获取单个进程CPU占用的方法,不过可以遍历所有进程分别获取再求和就是整个cpu占用率了。
#include <stdio.h>
#include <Windows.h>

typedef long long int64_t;
typedef unsigned long long uint64_t;

/// 时间转换
static uint64_t file_time_2_utc(const FILETIME* ftime)
{
LARGE_INTEGER li;

li.LowPart = ftime->dwLowDateTime;
li.HighPart = ftime->dwHighDateTime;
return li.QuadPart;
}

/// 获得CPU的核数
static int get_processor_number()
{
SYSTEM_INFO info;
GetSystemInfo(&info);
return (int)info.dwNumberOfProcessors;
}

int get_cpu_usage(int pid)
{
//cpu数量
static int processor_count_ = -1;
//上一次的时间
static int64_t last_time_ = 0;
static int64_t last_system_time_ = 0;

FILETIME now;
FILETIME creation_time;
FILETIME exit_time;
FILETIME kernel_time;
FILETIME user_time;
int64_t system_time;
int64_t time;
int64_t system_time_delta;
int64_t time_delta;

int cpu = -1;

if(processor_count_ == -1)
{
processor_count_ = get_processor_number();
}

GetSystemTimeAsFileTime(&now);

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time, &user_time))
{
return -1;
}
system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time))
/ processor_count_;
time = file_time_2_utc(&now);

if ((last_system_time_ == 0) || (last_time_ == 0))
{
last_system_time_ = system_time;
last_time_ = time;
return -1;
}

system_time_delta = system_time - last_system_time_;
time_delta = time - last_time_;

if (time_delta == 0)
return -1;

cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
last_system_time_ = system_time;
last_time_ = time;
return cpu;
}

int main()
{
while(1)
{
int cpu;
// 参数为进程id
cpu = get_cpu_usage(5160);
printf("CPU使用率: %d%%\n",cpu);

Sleep(1000);
}
return 0;
}
fengzhileiyi_
2015-01-29 · 超过129用户采纳过TA的回答
知道小有建树答主
回答量:250
采纳率:66%
帮助的人:129万
展开全部
查WINDOW提供的接口是什么,然后用C去调用获取当前数值,就好了,然后设置一个轮询,每间隔一段时间轮询一次就好了。
追问
有代码的话,发我下代码呗,省去麻烦。
.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式