获取cpu空闲率问题

tixisong 2015-01-07 03:12:15


__int64 CompareFileTime(FILETIME time1, FILETIME time2)//转换为整数时间
{
__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;
return (b - a);
}
void Cmfc_cpuDlg::OnBnClickedButton1()
{
HANDLE hEvent;
BOOL res;
FILETIME preidleTime;
FILETIME prekernelTime;
FILETIME preuserTime;
FILETIME idleTime;
FILETIME kernelTime;
FILETIME userTime;
res = GetSystemTimes(&idleTime, &kernelTime, &userTime);
preidleTime = idleTime;
prekernelTime = kernelTime;
preuserTime = userTime;

hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);// 初始值为 nonsignaled ,并且每次触发后自动设置为nonsignaled
while ( true){

Sleep(500);

//WaitForSingleObject(hEvent, 1000); //等待500毫秒
res = GetSystemTimes(&idleTime, &kernelTime, &userTime);

int idle = CompareFileTime(preidleTime, idleTime);
int kernel = CompareFileTime(prekernelTime, kernelTime);
int user = CompareFileTime(preuserTime, userTime);


float cpu = (kernel + user - idle) *100.0 / (kernel + user);
float cpuidle = (idle)*100.0 / (kernel + user);

CString szcpu;
szcpu.Format(_T("%lf"), cpu);

GetDlgItem(IDC_EDIT1)->SetWindowTextW(szcpu);

preidleTime = idleTime;
prekernelTime = kernelTime;
preuserTime = userTime;
}
}


以上代码在控制台中没有问题,用多线程发消息到主窗口显示没有问题,但我不想再开一个线程,只想通过一个函数中写while,sleep 或WaitForSingleObject,但发现界面为什么卡死呢,感觉计算这个空闲率不耗时,怎么会卡
...全文
212 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiht594 2015-01-29
  • 打赏
  • 举报
回复
一个线程就是一条线 ----->-----while在这---->-----------这里UI操作-------------> while一直在执行,后面的界面当然没反应了. timeSetEvent 好像也是新开的线程吧. setTimer是不开新线程的. 数据不对是你弄错了.和计时器没关系
lx624909677 2015-01-29
  • 打赏
  • 举报
回复
不想开多线程又想让主线程同时可以监听消息和发送数据,这个是一个不现实的想法啊。好比一条马路想让他走去东方向的车又想让他走向西方向的车,这明显是不现实的
版主大哥 2015-01-29
  • 打赏
  • 举报
回复
楼主 MFC有个主线程的,主线程就是界面线程 void Cmfc_cpuDlg::OnBnClickedButton1() 这个函数就是界面线程运行的 也就是当你按一下按钮,就会发1个对应的消息,给界面线程,界面线程就进入到这个函数。 界面线程的消息处理是

MSG msg ;        
while(TRUE)       
 {            
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))           
    {                
        if (msg.message == WM_QUIT)                 
        {
                     break;                
        }               
        DispatchMessage(&msg);            
    }
 }
主线程 DispatchMessage ---> void Cmfc_cpuDlg::OnBnClickedButton1()的时候里面用到了while,一直不返回,界面线程就卡住了,界面线程还怎么处理其他消息,不能处理其他消息,界面不就卡住了?
baoyz 2015-01-29
  • 打赏
  • 举报
回复
settimer() Ontimer()
Yofoo 2015-01-08
  • 打赏
  • 举报
回复
Sleep(500);这个改成消息循环就不会卡了, 或者你的这个函数在定时器调用, 不要Sleep
tixisong 2015-01-08
  • 打赏
  • 举报
回复
引用 3 楼 zzz3265 的回复:
Sleep(500);这个改成消息循环就不会卡了, 或者你的这个函数在定时器调用, 不要Sleep
我就在定时调用的,但调用的结果不对,没有变化
tixisong 2015-01-07
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
因为你有while循环,会阻塞主线程消息,所以要开线程。
我用timeSetEvent 定时500ms 调用一次,但获取的不对,FILETIME preidleTime; FILETIME prekernelTime; FILETIME preuserTime; FILETIME idleTime; FILETIME kernelTime; FILETIME userTime;这几个变量用全局或静态试了,界面不卡但数据不正确?真不想开线程了,我的线程经很多。
oyljerry 2015-01-07
  • 打赏
  • 举报
回复
因为你有while循环,会阻塞主线程消息,所以要开线程。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧