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

来源:互联网 发布:百合网数据库 编辑:程序博客网 时间:2024/05/20 03:08

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

        建立一个基于对话框的工程 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 threadclass CUIThread : public CWinThread{DECLARE_DYNCREATE(CUIThread)// Attributespublic:// Operationspublic:CUIThread();           //  constructor used by dynamic creation// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CUIThread)public:virtual BOOL InitInstance();virtual int ExitInstance();//}}AFX_VIRTUAL// Implementationprotected:virtual ~CUIThread();CUIThreadDlg m_dlg;// Generated message map functions//{{AFX_MSG(CUIThread)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSGDECLARE_MESSAGE_MAP()};

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

BOOL CUIThread::InitInstance(){// TODO:  perform and per-thread initialization herem_dlg.Create(IDD_UITHREADDLG);m_dlg.ShowWindow(SW_SHOW);m_pMainWnd = &m_dlg;return TRUE;}int CUIThread::ExitInstance(){// TODO:  perform any per-thread cleanup herem_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用户界面多线程工程案例

0 0