关于VC大循环中降低CPU占用率在问题.大虾请指点!

xinai0521 2006-06-23 10:26:41
我的代码(VC)有很大一个循坏,当我运行的时候CPU点用100%,窗口移动不响应!
在VB可以用Doevents做到,但VC我就不知道用什么方法了,请指点!
...全文
500 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahao 2006-06-30
  • 打赏
  • 举报
回复
用线程比较好
KeSummer 2006-06-30
  • 打赏
  • 举报
回复
不应该这样说,应该说用多线程是提高效率才对.楼上的想想啊..用多线程的话,主线程响应界面的消息就相当于DoEvents()了.如果没有界面消息到来的话,DoEvents()执行起来会很轻松的.
二次消息循环相当于只用一个线程去做了两个线程的事情,当然一个线程和两个线程效率谁高..大家心里很清楚..只不过谁简单,谁方便而已.
xinai0521 2006-06-30
  • 打赏
  • 举报
回复
谢谢楼上的KeSummer,
to KeSummer:
其实我想了想,还是多线程好,看了一个关于多线程示例代码,我的问题解决了,而且我估计用多线程,其实效率应该比你重载,重载了消息循环,时间效率应该没有多线程好吧?
而且我的循环也特别大,n的三次方,n>10000样子,如果把你DoEvents放入执行次数太多了,浪费了一些时间,不知道我理解错了没有呢?
xinai0521 2006-06-30
  • 打赏
  • 举报
回复

呵呵,KeSummer你说对!结贴了,谢谢KeSummer这位朋友以及所有的帮忙的朋友!以后还要多麻烦你们帮忙!谢谢..
hurryboylqs 2006-06-25
  • 打赏
  • 举报
回复
Sleep一下
KeSummer 2006-06-25
  • 打赏
  • 举报
回复
嘿嘿~~二次消息循环很少人知道的.它能达到VBDoevents的效果,而且是VC++的.
KeSummer 2006-06-25
  • 打赏
  • 举报
回复
下面的代码重载了消息循环,根本用不着多线程.
把Doevents放到大循环里就可以响应界面了.


void CDoeventsDlg::DoEvents()
{
MSG msg;
if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { //从Windows消息队列中取出消息
if (msg.message== WM_QUIT)//如果消息为退出,发送退出消息
{
::PostQuitMessage(-1);
}
if(!AfxGetApp()->PreTranslateMessage(&msg))//如果无法预处理消息
{
::TranslateMessage(&msg);//转换消息
::DispatchMessage(&msg);//发送消息
}
}
AfxGetApp()->OnIdle(0);AfxGetApp()->OnIdle(1);//消息队列为空时闲置一段时间
}


void CDoeventsDlg::OnTask()
{
int iStep = 0;
m_pgProgress.SetRange(0, 500 );//设置进度条范围
m_pgProgress.SetStep(1);//步长
m_pgProgress.SetPos(0);//初始位置
m_bIsWorking = TRUE;
m_bStop = FALSE;//是否停止工作
m_pbTask.EnableWindow(FALSE);
while(!m_bStop && iStep <= 500) {
iStep++;
m_pgProgress.StepIt();
Sleep(20);
DoEvents(); // 二次消息循环函数
}
m_bIsWorking = FALSE;
m_pgProgress.SetPos(0);
m_pbTask.EnableWindow(TRUE);
}
fireseed 2006-06-25
  • 打赏
  • 举报
回复
只能用多线程了,不是因为CPU占用100%而导致界面不动,而是因为整个窗体的消息处理的流程由于你的算法没有返回而无法继续执行了。
KeSummer 2006-06-25
  • 打赏
  • 举报
回复
Sleep()一下,或者重载消息循环可以达到Doevents的效果,而且不是多线程的.
hijack 2006-06-25
  • 打赏
  • 举报
回复
不用多线程,就只能加等待光标凑合了
wenzhousun 2006-06-23
  • 打赏
  • 举报
回复
GetMessage and PeekMessage
xinai0521 2006-06-23
  • 打赏
  • 举报
回复
除了多线程?以外?
是不是别无它法了?
折腾_苏州 2006-06-23
  • 打赏
  • 举报
回复
VB可以用Doevents做到;
Delphi可以用Application.ProcessMessages;做到;
VC可以用多线程做到.
anothervip 2006-06-23
  • 打赏
  • 举报
回复
用多线程吧

16,550

社区成员

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

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

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