方法一:不创建新的进程
1、拖一个progress control控件在对话框上,将该控件的Marquee属性设为True。在添加两个Button控件。如下图所示:
2、给控件添加个变量m_progress,再添加int 型的变量m_nCount.
3、启动定时器:SetTimer(1,10,NULL)。
<pre class="cpp" name="code">void CProgressDlg ::OnBnClickedButtonStart()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1,10, NULL);
}
4、添加消息处理函数。
在对话框属性栏中,点击属性,添加WM_TIMER消息函数,如下图所示:
void CProgressDlg ::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_Progress.SetPos(m_nCount);
/*if (4 == m_nCount)
{
m_nCount = 1;
}
else
{
m_nCount ++;
}*/
CDialogEx::OnTimer(nIDEvent );
}
5、销毁定时器,KillTimer()。
给结束按钮添加事件。
void CProgressDlg ::OnBnClickedButtonEnd()
{
// TODO: 在此添加控件通知处理程序代码
KillTimer(1);
}
方法二:创建工作者线程。
创建工作者线程的步骤:
(1),先编写一个与应用程序的其余部分并行运行的函数Fun1()。
(2),定义一个指向CWinThread对象的指针变量*pThread。
(3),调用AfxBeginThread(Fun1,pParam,Priority)函数。
(4),函数返回值赋给pThread变量,同时一并启动Fun1函数。
效果图:
1、先添加好相应的控件Progress Control和Static Text控件,再添加相应控件的变量m_MyProcess
2、编写函数Fun1:
UINT MyThread(LPVOID pParam)
{
CMyThreadDlg *pDlg = (CMyThreadDlg *)pParam;
CProgressCtrl *pPro = &pDlg->m_MyProcess;
for (int i = 1; i <=100; ++i)
{
i++;
pPro->SetPos(i);
CString s;
s.Format( _T("%d%%" ), i);
pDlg->m_MyStatic.SetWindowTextW(s);
Sleep(100);
}
return 0;
}
3、调用AfxBeginThread(Fun1,pParam,Priority)函数。
void CMyThreadDlg ::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
AfxBeginThread(MyThread, ( LPVOID)this );
//CDialogEx::OnOK();
}
方法三:创建用户界面线程
创建用户界面线程步骤:
(1)从CWinThread类派生一个类,并用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现这个派生类,重载该派生类的成员函数InitInstance()和ExitInstance().
(2)插入一个对话框资源,在对话框中添加进度条控件并添加该控件的变量,然后创建该对话框类。
(3)在第一步中派生的类中的成员函数InitInstance()进行初始化要创建对象的线程实例。
(4)调用AfxBeginThread函数。
点击图一的开始按钮,弹出图二对话框,一个进度条在走。效果图:
1、CWinThread类派生一个类MyThreadPS,在类视图中,右击打开类向导界面,点击添加类的下拉箭头,选择MFC类,给类取个名字,基类选择CWinThread。其中用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现的这个过程是自动实现的。
2、插入对话框资源。在插入的对话框右击添加类和添加变量。
3、给插入的对话框添加Progress Control控件。
4、在类MyThreadPS的成员函数InitInstance()进行初始化。(m_Dlg是MyUIThread类对象。)
BOOL MyThreadPS ::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
m_Dlg.Create( IDD_DIALOG1);
m_Dlg.ShowWindow( SW_SHOW);
m_pMainWnd = &m_Dlg;
SetTimer(GetActiveWindow(), 1, 10, NULL);//启动定时器
return TRUE ;
}
int MyThreadPS ::ExitInstance()
{
// TODO: 在此执行任意逐线程清理
m_Dlg.DestroyWindow();
return CWinThread ::ExitInstance();
}
5、添加WM_TIMER消息函数
voidMyUIThread::OnTimer(UINT_PTRnIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_MyPro.SetPos(m_nCount);
CDialogEx::OnTimer(nIDEvent );
}
6、调用AfxBeginThread函数,在主界面的按钮添加一下代码:
void CMyThreadDlg ::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS (MyThreadPS));
}