[MFC]多任务线程

实例——MultiTestThread

头文件关键代码:

 

// MultiTestThreadDlg.h : 头文件
#define WM_MSG WM_USER+1
class CMultiTestThreadDlg;
typedef struct THREAD_PARAM
{
	CMultiTestThreadDlg* pDlg;
	int nIndex; 
}_THREAD_PARAM;
UINT ThreadFun(LPVOID pParam);

 

 

cpp文件关键代码:

 

// MultiTestThreadDlg.cpp : 实现文件
CMultiTestThreadDlg::CMultiTestThreadDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CMultiTestThreadDlg::IDD, pParent) 
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	//成员变量
	// 	CWinThread* pThread1;
	// 	CWinThread* pThread2;
	// 	THREAD_PARAM mThreadParam;
	// 	CProgressCtrl mPgsCtrlOne;
	// 	CProgressCtrl mPgrsCtrlTwo;
	pThread1=NULL;
	pThread2=NULL;
	mThreadParam.pDlg=NULL;
}  
void CMultiTestThreadDlg::DoDataExchange(CDataExchange* pDX)
{
	//成员变量
	// 	CWinThread* pThread1;
	// 	CWinThread* pThread2;
	// 	THREAD_PARAM mThreadParam;
	// 	CProgressCtrl mPgsCtrlOne;
	// 	CProgressCtrl mPgrsCtrlTwo;
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_PROGRESS_ONE, mPgsCtrlOne);
	DDX_Control(pDX, IDC_PROGRESS_TWO, mPgrsCtrlTwo);
}

BEGIN_MESSAGE_MAP(CMultiTestThreadDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_START1, &CMultiTestThreadDlg::OnBnClickedButtonStart1)
	ON_BN_CLICKED(IDC_BUTTON_START2, &CMultiTestThreadDlg::OnBnClickedButtonStart2)
	ON_BN_CLICKED(IDC_BUTTON_RESET, &CMultiTestThreadDlg::OnBnClickedButtonReset)
	//ON_MESSAGE(WM_MSG,&CMultiTestThreadDlg::OnMsgFun)//可以由virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);来替代
END_MESSAGE_MAP()
//重写CDialogEx::WindowProc( )消息函数
LRESULT CMultiTestThreadDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if (message == WM_MSG)
	{
		if (wParam==1)
		{
			mPgsCtrlOne.SetPos(lParam);
		}
		else if (wParam == 2)
		{
			mPgrsCtrlTwo.SetPos(lParam);
		}
	}
	return CDialogEx::WindowProc(message,wParam,lParam);//注意是CDialogEx
}
//WM_MSG消息函数,ON_MESSAGE(WM_MSG,&CMultiTestThreadDlg::OnMsgFun)
LRESULT CMultiTestThreadDlg::OnMsgFun(WPARAM wParam,LPARAM lParam)
{
	if (wParam==1)
	{
		mPgsCtrlOne.SetPos(lParam);
	}
	else if (wParam == 2)
	{
		mPgrsCtrlTwo.SetPos(lParam);
	}
	return 0;
}
//启动按钮1按钮
void CMultiTestThreadDlg::OnBnClickedButtonStart1()
{   
	if (pThread1 != NULL)
	{
		DWORD exitCode=0;
		if (::GetExitCodeThread(pThread1->m_hThread,&exitCode))
		{
			if (exitCode == STILL_ACTIVE)
			{
				AfxMessageBox(L"线程1已经启动。"); 
				return;
			} 
		}
	} 
	mThreadParam.nIndex=1;
	mThreadParam.pDlg=this;
	pThread1=AfxBeginThread(ThreadFun,&mThreadParam);
}
//启动线程2按钮
void CMultiTestThreadDlg::OnBnClickedButtonStart2()
{ 
	if (pThread2)
	{
		DWORD exitCode=0;
		if (::GetExitCodeThread(pThread2->m_hThread,&exitCode))
		{
			if (exitCode == STILL_ACTIVE)
			{
				AfxMessageBox(L"线程2已经启动。"); 
				return;
			} 
		}
	}
	mThreadParam.nIndex=2;
	mThreadParam.pDlg=this; 
	pThread2=AfxBeginThread(ThreadFun,&mThreadParam);
	//pThread2->m_bAutoDelete=FALSE;//当为false时,要在析构函数中,进行WaitForSingleObject()删除线程
}
//重置按钮事件
void CMultiTestThreadDlg::OnBnClickedButtonReset()
{ 
	//终止线程
	if (pThread1)
	{
		TerminateThread(pThread1->m_hThread,NULL);
	}
	if (pThread2)
	{
		TerminateThread(pThread2->m_hThread,NULL);
	}
	//重置进度条
	mPgsCtrlOne.SetRange(0,100);
	mPgsCtrlOne.SetPos(0);
	mPgrsCtrlTwo.SetRange(0,100);
	mPgrsCtrlTwo.SetPos(0);
}
//线程函数,其格式是:UINT Fun(LPVOID pParam)
UINT ThreadFun(LPVOID pParam)
{
	THREAD_PARAM* pThreadParam=(THREAD_PARAM*)pParam;
	for (int i=0;i<1001;i++)
	{ 
		if (i%10==0)//是10的倍数时发送消息,更新对应的进度条
		{
			Sleep(1);//延缓时间
			::PostMessage(pThreadParam->pDlg->m_hWnd,WM_MSG,pThreadParam->nIndex,i/10);  
		}
	}
	return 0;
}


结构图:

 

 

posted @ 2013-04-28 19:22  javawebsoa  Views(281)  Comments(0Edit  收藏  举报