2023年6月22日发(作者:)
VC中进度条实时显示的解决方法
2009-02-19 19:51:00| 分类: MFC 阅读301 评论2 字号:大中小 订阅
当我们在处理大程序时,常常需要耗很长时间,为了不让用户错误的认为系统已经死机,我们要给程序添加进度条,但是大家知道如果就直接添加进度条,并在程序里面控制它的进度,往往得到的结果是程序仍然像死机状态,直到处理完毕才显示进度条进度为100%,中间的过程看不到了,那么怎么办呢,是为什么呢?
原因是我们处理大程序和进度条显示是在同一个线程中进行的,这样往往因为处理大程序导致界面无法实时更新。解决办法就是把处理大程序的这段逻辑让一个单独的线程在处理,并利用postmessage或sendmessage给主界面发送消息,让主界面去更新。
具体代码实现如下:
1.首先,定义一个关联事件
#define WM_UPDATEDATA WM_USER + 1999 //定义事件
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_MESSAGE(WM_UPDATEDATA, &CMyDialog::OnUpdateData) //让事件关联程序
END_MESSAGE_MAP()
在MyDialog.h文件中声明函数afx_msg LRESULT OnUpdateData(WPARAM wParam, LPARAM
lParam);
2.第二,实现关联程序(返回类型一定要是LRESULT)
在文件中实现消息响应函数OnUpdateData
LRESULT CMyDialog::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
int iTmp = (int)wParam;
m_(iTmp);//设置进度条的值
UpdateData(false);//实时更新主界面
return 0;
}
3.第三,创建一个独立的线程处理大程序
m_pMyThread = AfxBeginThread(MyThread, this);//MyThread为该大程序处理的入口函数,this为入口函数的参数
m_pMyThread = NULL; //线程结束后,将m_pMyThread置为空
4.第四,实现大程序逻辑
UINT MyThread(LPVOID pParam) //注意返回类型为UINT,进程函数应该为全局函数或这类的Static成员函数
{
CMyDialog *pDlg = (CMyDialog *)pParam; //这里添加计算过程
int iRec = pDlg->ProcessLogFile(......); //调用具体处理大程序的逻辑函数
return 0;
}
5.第五,在处理大程序的函数中向主线程发送消息让进度条实时更新
int CMyDialog::ProcessLogFile(......)
{
...........
while(...)
{
..........
//调用进度条实时更新函数实时更新进度条
SetProcess(value);
}
}
//进度条实时更新函数
void CMyDialog::SetProcess(int value)
{
SendMessage(WM_UPDATEDATA, value);//向主线程发送消息更新进度条
}
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687423247a8957.html
评论列表(0条)