当某段代码执行时间过长时,导致界面一直处于一个状态,不可进行其他操作时,这时使用进度条来告诉用户处理进度是相当必要的。下面介绍在MFC下,如何使用多线程在对话框中控制进度条。
首先,创建一个对话框,并建立与其对应的类,当然需要添加一个进度条控件。如下图
MFC+多线程+对话框+进度条
然后在对话框对应的类中添加两个函数:
void CJingDuTiao::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
//CDialog::OnTimer(nIDEvent);
m_ctrlProgress.SetPos(CGlobal::progress);
if(CGlobal::progress == -1)
this->EndDialog(true);
}
void CJingDuTiao::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
this->KillTimer(1);
this->SetTimer(1,20, NULL);
m_ctrlProgress.SetRange(1,1000);
}
其中progress是在类CGlobal中定义的一个静态变量,且初始值为0.
m_ctrlProgress为进度条的变量。
再在主程序(MainFrm)中添加两个子进程需要处理的函数
如:
UINT function(LPVOID pParam)
{
for(int i = 0; i < 1000; i++){
CGlobal::progress++;
Sleep(50);
}
CGlobal::progress = -1;
return 0;
}
这个函数(function)是用来控制进度条变化的函数。
UINT function1(LPVOID pParam)
{
//=============
在此添加需要处理长时间的代码
//==============
return 0;
}
最后在需要运动进度条的地方添加
AfxBeginThread(function1,this);//申请一个进程来执行function1,也就是主程序处理代码。
AfxBeginThread(function,this);//在申请一个进程来执行function,控制进度条的变化。
dlg1->DoModal();//模态显示对话框,此时主程序代码执行到此,不往下执行,直至对话框关闭,但是两个
//子进程始终在运行中。
其中dlg1是对话框的一个对象。
这样一个同事处理数据且显示进度条对话框的功能就实现了。