子线程执行进度条


最近自己的程序在做压力测试的时候,发现加载数据时卡死了,虽然也能运行,但是界面卡死体验感觉很不爽,所以得做一个进度条,把数据加载过程放在子线程完成,这样界面用着就舒服多了。


程序比较简单,只是提供一种思路,有兴趣的可以去完善。


这儿有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实现了对进度条的控制,日后自己的任务只要继承这个线程就可以实现进度条的控制了。

效果图:


这儿有个问题待解决:

线程的完成情况怎么告诉进度条界面,一是发消息,二是主界面定时刷新,这儿我两种方式都尝试了,都可以达到效果。但是有个问题,我想让界面加载完后自动关掉加载界面,发送消息的方式有时候会出错,到底为什么还没弄清楚。


整个工程文件在我的资源里面。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六个沃德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值