一.简单认识

MFC中将线程分为用户界面线程和工作线程,两者最大的区别是前者是和界面相关联的,而后者是进行后台的一些操作.

二.如何创建

MFC中的线程大多继承自CWinThread,而相关联的界面可以继承自CFrameWnd,也可以继承自对话框之类的(感觉只要是界面类,就可以吧).

它的创建过程大概是这样的:

1.在主线程中建立用户界面线程,比如这里是CMyThread类型的.

2.在CMyThread::InitInstance中去创建一个界面对象,比如这里是CMyWnd类型的.此时就相当于把用户界面和该线程进行了关联.

3.在界面对象类中去实现你想要执行的操作,比如鼠标左键会弹出MessageBox之类的.

三.举个例子

假如你要完成这样的功能:

在主窗口中点击鼠标左键,创建用户界面线程,然后在新的界面中点击鼠标左键弹出MessageBox.

它的实现逻辑大致如下.

MFC的用户界面线程_#include

四.关键代码

这里是用对话框作为主窗口来实现的.


//MyThread2.h

#pragma once
#include "afxwin.h"
#include "MyWnd2.h"
class CMyThread2 :
public CWinThread
{
public:
CMyThread2();
~CMyThread2();

//重写父类的方法
virtual BOOL InitInstance();
virtual int ExitInstance();

public:
CMyWnd2 *m_pMyWnd;
};



//MyThread2.cpp
#include "stdafx.h"
#include "MyThread2.h"

CMyThread2::CMyThread2()
{
}


CMyThread2::~CMyThread2()
{
if (m_pMyWnd)
{
delete m_pMyWnd;
m_pMyWnd = NULL;
}
}

BOOL CMyThread2::InitInstance()
{
m_pMyWnd = new CMyWnd2();
m_pMyWnd->Create(NULL, _T("用户界面线程"));
m_pMyWnd->ShowWindow(SW_SHOW);
m_pMyWnd->UpdateWindow();
return TRUE; //此处要返回TRUE,否则线程生成不了.why?(暂莫发散)
}

int CMyThread2::ExitInstance()
{
return 0;
}



//MyWnd2.h

#pragma once
#include "afxwin.h"
class CMyWnd2 :
public CFrameWnd
{
public:
CMyWnd2();
~CMyWnd2();

//重写父类的方法
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()  //这里需要此声明,否则BEGIN_MESSAGE_MAP那里会报错.
};



//MyWnd2.cpp

#include "stdafx.h"
#include "MyWnd2.h"


CMyWnd2::CMyWnd2()
{
}


CMyWnd2::~CMyWnd2()
{
}

BEGIN_MESSAGE_MAP(CMyWnd2, CWnd)
ON_WM_LBUTTONDOWN() //如果要用到这个响应,就需要在这里声明.
END_MESSAGE_MAP()

void CMyWnd2::OnLButtonDown(UINT nFlags, CPoint point)
{
MessageBox(_T("终于等到你了"), _T("你好啊"), MB_OK);
CWnd::OnLButtonDown(nFlags, point);
}



//UserInterfaceThreadDlg.cpp(主窗口)中的关键代码

void CUserInterfaceThreadDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
//AfxBeginThread(RUNTIME_CLASS(CMyThread2));//使用这种方法会报内存不足的错误.
CMyThread2 *myThread = new CMyThread2(); //?? 在这里new,在哪里去释放呢?
myThread->CreateThread();
CWnd::OnLButtonDown(nFlags, point); //记得要把父类的方法在最后写上
}