帮忙看一上这段代码哪里出了有关问题.多谢

帮忙看一下这段代码哪里出了问题....谢谢
本帖最后由 zjjne 于 2012-12-08 00:39:44 编辑



//GetProcessCpuPencentage 是在头文件里面定义好的一个类,
//用来成员函数GetProcCpuPencent()获取进程的CPU占用率

int GetProcessCpuPencentage::GetProcCpuPencent(int pid)

//[in] pid 要获取CPU占用率的进程ID,函数返回int型值CPU使用率


这个函数运行没问题,用控制台程序来调用,输出某进程占用CPU率正常

但是用MFC调用,将获得值插入ListView中,就出了问题...

用了个SetTimer,每3秒调用一次Out_Process_Cpu()

MFC具体调用代码如下:


void Cpage_proc::Out_Process_Cpu()
{
GetProcessCpuPencentage CCpuPercent;

CString cs_CPU_pID;
DWORD dw_CPU_pID;
DWORD dw_pCpu;     //留给将dw_pCpu数字格式化为字符串的时候用
CString cs_pCpu;    //留给将dw_pCpu数字格式化为字符串的时候用

int iCpu;

for(int iNum = 0; iNum < m_list_process.GetItemCount(); iNum++)    // GetItemCount()获取列表视图中项的总数
{

cs_CPU_pID = m_list_process.GetItemText(iNum, 1);    //获取m_list中第iNum行(选中行)的第1个子项的内容,即进程ID

sscanf(cs_CPU_pID, "%d", &dw_CPU_pID);    //sscanf()将cs_CPU_pID的内容以dw_CPU_pID的格式(DWORD)转换并储存到dw_CPU_pID中

iCpu = CCpuPercent.GetProcCpuPencent( dw_CPU_pID );

if( iCpu < 0 || iCpu >100 )
{
cs_pCpu = "False";
}
else
{
dw_pCpu = iCpu;
cs_pCpu.Format("%d", dw_pCpu);    //将dw_pCpu数字格式化为字符串,以便SetItemText()函数使用
}

m_list_process.SetItemText( iNum, 3, cs_pCpu );     //输出插入到列表视图具体项中
}
}


但是最终却是ListView的第一行中的项能不停刷新数据,且有数据
而第二行到最后一行却都是显示False

跟踪调试时都cs_pCpu的值大多都是0-100间,数据获取正常

实在没搞懂怎么会这样

所以上来CSDN问了,谢谢了
------解决方案--------------------
for 循环打印出iCpu ( = CCpuPercent.GetProcCpuPencent( dw_CPU_pID );)

for 循环加延时试试。
------解决方案--------------------
system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) 
        / processor_count_;  

...............我看你需要好好的把计时的逻辑重新写一遍了。
------解决方案--------------------
思路错误。
应该使用WMI或 PDH 获取进程占用CPU情况。