MFC多线程编码--用户界面线程(四)

         下面以一个实例来介绍用户界面多线程编程。

        建立一个基于对话框的工程 MultiThreadTest,在对话框 IDD_MultiThreadTest_DIALOG 中加入一个按钮 IDC_UI_THREAD,标题为用户界面线程。右击工程并选中“New Class…”为工程添加基类为 CWinThread 派生线程类 CUIThread。给工程添加新对话框 IDD_UITHREADDLG,标题为线程对话框。为对话框 IDD_UITHREADDLG 创建一个基于 CDialog 的类 CUIThreadDlg。使用 ClassWizard为 CUIThreadDlg 类添加 WM_LBUTTONDOWN 消息的处理函数 OnLButtonDown如下:

void CUIThreadDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{	
	AfxMessageBox("我是线程对话框发出的消息");
	CDialog::OnLButtonDown(nFlags, point);
}

在 CUIThread.h 中添加

#include "CUIThreadDlg.h"

并在 CUIThread 类中添加 protected 变量 CUIThreadlg m_dlg

    CUIThread类的头文件如下:

#include "CUIThreadDlg.h"
// CUIThread thread

class CUIThread : public CWinThread
{
	DECLARE_DYNCREATE(CUIThread)

// Attributes
public:

// Operations
public:
	CUIThread();           //  constructor used by dynamic creation

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CUIThread)
	public:
	virtual BOOL InitInstance();
	virtual int ExitInstance();
	//}}AFX_VIRTUAL

// Implementation
protected:
	virtual ~CUIThread();
	CUIThreadDlg m_dlg;
	

	// Generated message map functions
	//{{AFX_MSG(CUIThread)
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};

分别重载 InitInstance()函数和 ExitInstance()函数:

BOOL CUIThread::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	m_dlg.Create(IDD_UITHREADDLG);
	m_dlg.ShowWindow(SW_SHOW);
	m_pMainWnd = &m_dlg;
	return TRUE;
}

int CUIThread::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	m_dlg.DestroyWindow();
	return CWinThread::ExitInstance();
}

为避免内存泄露,在CUIThreadDlg 添加WM_DESTROY消息处理函数:

void CUIThreadDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	delete this;
}
双击按钮 IDC_UI_THREAD,添加消息响应函数:

void CMultiThreadTestDlg::OnBtnUithread() 
{		
	CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(CUIThread));	
}

       注意:要把 UIThread.h 中类 CUIThread()的构造函数的特性由 protected 改为 public

        用户界面线程的执行次序与应用程序主线程相同,首先调用用户界面线程类的InitInstance() 函数,如果返回 TRUE,继续调用线程的 Run()函数,该函数的作用是运行一个标准的消息循环,并且当收到 WM_QUIT 消息后中断,在消息循环过程中,Run()函数检测到线程空闲时(没有消息),也将调用 OnIdle() 函数,最后 Run() 函数返回, MFC 调用ExitInstance()函数清理资源。

        你可以创建一个没有界面而有消息循环的线程,例如:你可以从 CWinThread 派生一个新类,在 InitInstance 函数中完成某项任务并返回 FALSE,这表示仅执行 InitInstance 函数中的任务而不执行消息循环,你可以通过这种方法,完成一个工作者线程的功能。

         工程案例代码下载:MFC用户界面多线程工程案例

你可能感兴趣的:(多线程,mfc)