最近自己的程序在做压力测试的时候,发现加载数据时卡死了,虽然也能运行,但是界面卡死体验感觉很不爽,所以得做一个进度条,把数据加载过程放在子线程完成,这样界面用着就舒服多了。
程序比较简单,只是提供一种思路,有兴趣的可以去完善。
这儿有3个内,一个是简单封装的线程类CMyThread,一个是进度条的类CProgressDialog,一个进度条处理类CProgressThread,最后就是处理你自己认为的线程类CTestThread。
class CMyThread
{
public:
CMyThread(BOOL bSuspend=FALSE);
~CMyThread(void);
static DWORD ThreadProc(void *pThread);
public:
void Start(); //开始
void Suspend(); //挂起
void Resume(); //继续
void Terminate(); //终止
void Join(DWORD dwTimeOut = INFINITE);
virtual void Run()=0;
//继承子类重写
virtual void OnStart();
virtual void OnSuspend();
virtual void OnResume();
virtual void OnTerminate();
protected:
void DoStart();
void DoSuspend();
void DoResume();
void DoTerminate();
private:
HANDLE hThread;
HANDLE hWaitFor; //等待线程执行完毕
DWORD threadID;
public:
volatile bool bTerminated;
};
class CProgressThread:public CMyThread
{
public:
CProgressThread(CProgressDialog *pProgressDlg, BOOL bAutoClose=FALSE);
~CProgressThread(void);
private:
BOOL bAutoClose; //是否自动关闭
CProgressDialog *m_pProgressDlg;
public:
void SetPos(double pos);
void SetProgressText(const char *msg);
void SetProgress(const char *msg, double pos, int iWaitTime);
void Run(void);
void PushProgressMessage(int iCode);
};
class CTestThread: public CProgressThread
{
public:
CTestThread(CProgressDialog *pProgressDlg, BOOL bAutoClose=FALSE);
~CTestThread(void);
void Run(void);
};
void CProgressDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CProgressDialog dlg("测试线程进度条");
CTestThread thread(&dlg, false);
if(dlg.DoModal() == IDOK){
}
}
工作流程:
CProgressThread实现了对进度条的控制,日后自己的任务只要继承这个线程就可以实现进度条的控制了。
效果图:
这儿有个问题待解决:
线程的完成情况怎么告诉进度条界面,一是发消息,二是主界面定时刷新,这儿我两种方式都尝试了,都可以达到效果。但是有个问题,我想让界面加载完后自动关掉加载界面,发送消息的方式有时候会出错,到底为什么还没弄清楚。
整个工程文件在我的资源里面。