VC进度条的使用方法

VC进度条的使用方法

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信