关于进度条和多线程的问题 问题是这样的,我有一个函数执行速度非常的慢,我想给此函数加一个进度条来显示它的执行进度。大家给帮忙出个主意。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如何知道函数的执行时间,而且如果函数参数,或者是cpu类型不一样,它的执行时间也不一样啊。 可以不用线程来实现进度条的加载,利用二次消息循环异步地加载,代码如下: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);//消息队列为空时闲置一段时间 } /* ------------------------------------------------------------------------- Large Large task... ------------------------------------------------------------------------- */ 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); } 在这里的PeekMessage不能使用PM_NOREMOVE,否则界面会僵死的。 PROCESS EXPLORER 取句柄问题 实例传参进线程,不能DELETE,内存泄露 在那里设置生成程序所在适应的操作系统. vc6工程用vc7编译转换后为什么stl(例如vector)不能用呢?如何解决? BCGControlBar的动态编译没问题,但静态编译时报 外部符号未解决 的错误 各位高手,有没有看过《深入浅出mfc》的? 关于UML? 谁能说明一下怎样根据 ListCtrl 所点击的 Column 来进行排序! 请问用控制台怎么输出彩色的文字 求助:怎么用 API 来播放和停止 flash 啊,谢谢! 请教如何让对话框同时拥有一个浮动的日志面板? 求建模软件设计思路
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);//消息队列为空时闲置一段时间
} /* -------------------------------------------------------------------------
Large Large task...
------------------------------------------------------------------------- */ 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);
}
在这里的PeekMessage不能使用PM_NOREMOVE,否则界面会僵死的。