MFC的用户界面线程

一.简单认识

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

二.如何创建

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

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

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

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

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

三.举个例子

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

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

它的实现逻辑大致如下.

四.关键代码

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

//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);    //记得要把父类的方法在最后写上
}

本文参考文章:https://www.cnblogs.com/lidabo/p/3489639.html

新战场:https://blog.csdn.net/Stephen___Qin
原文地址:https://www.cnblogs.com/Stephen-Qin/p/12619843.html