MFC线程-通过CWinThread派生类实现

基本步骤

1.创建 CWinThread 派生类

从 CWinThread 继承,并重写以下虚函数:

InitInstance():线程初始化方法,执行线程启动时的资源分配和初始化操作。

ExitInstance():线程结束时的清理方法,负责释放线程创建时分配的资源。

Run()(可选):线程执行的核心逻辑,在这里处理线程的实际任务(例如循环计算、后台任务等)。
2.创建线程对象

使用 AfxBeginThread 或直接调用 CreateThread 方法启动线程。
3.管理线程生命周期

根据需要设置 m_bAutoDelete,选择自动或手动销毁线程对象。在线程结束时确保资源正确清理。

创建 CWinThread 派生类

首先,从 CWinThread 派生出自定义线程类,并重写 InitInstanceRunExitInstance 函数。

头文件:

#pragma once
#include <afxwin.h>

class ThreadDoManger : public CWinThread
{
public:
	ThreadDoManger(HWND hWnd);
	virtual BOOL InitInstance() override;
	virtual int ExitInstance() override;
	virtual int Run() override;

private:
	HWND m_hWnd; // 用于通知主线程的窗口句柄
};

CPP文件:

#include "stdafx.h"
#include "ThreadDoManger.h"


// 构造函数
ThreadDoManger::ThreadDoManger(HWND hWnd) : m_hWnd(hWnd) {}

// 初始化线程
BOOL ThreadDoManger::InitInstance()
{
	AfxMessageBox(_T("线程初始化成功!"));
	return TRUE;
}

// 清理线程
int ThreadDoManger::ExitInstance()
{
	AfxMessageBox(_T("线程清理完成!"));
	return CWinThread::ExitInstance();
}

// 线程主体执行代码
int ThreadDoManger::Run()
{
	int sum = 0;
	for (int i = 1; i <= 10; ++i)
	{
		sum += i;
		CString strMsg;
		strMsg.Format(_T("线程正在运行,计数: %d  \n"), i);
		TRACE(strMsg);
		Sleep(500); // 模拟耗时操作,每次累加休眠 50ms
	}

	// 任务完成后,通知主线程
	::PostMessage(m_hWnd, WM_USER + 1, sum, 0);
	return 0;
}

主线程调用及与主线程通信

线程完成任务后,主线程需要接收并处理消息。我们可以通过 PostMessage 来向主线程发送计算结果。下面是主线程中如何接收并处理这个消息。

头文件:

#define WM_USER_TASK_COMPLETED (WM_USER + 1) // 定义消息

class CMFCtestThreadDlg : public CDialogEx
{
private:
    ThreadDoManger* m_pThread; // 线程对象指针
public:
    afx_msg LRESULT OnTaskCompleted(WPARAM wParam, LPARAM lParam); // 消息处理方法
    DECLARE_MESSAGE_MAP()
};

在主线程的消息映射中,注册并处理 WM_USER_TASK_COMPLETED 消息。

OnBnClickedButton5:通过点击按钮启动线程,并将主窗口句柄传递给线程对象,以便线程能通过消息通知主线程。

OnTaskCompleted:线程完成任务后,接收到的消息中包含计算结果。主线程显示这个结果,并手动清理线程对象。

CPP文件:

BEGIN_MESSAGE_MAP(CMFCtestThreadDlg, CDialogEx)
    ON_MESSAGE(WM_USER_TASK_COMPLETED, &CMFCtestThreadDlg::OnTaskCompleted) // 注册消息
END_MESSAGE_MAP()

void CMFCtestThreadDlg::OnBnClickedButton5()
{
    m_pThread = new ThreadDoManger(m_hWnd); // 创建线程并传递主窗口句柄

    if (!m_pThread->CreateThread())
    {
        AfxMessageBox(_T("线程创建失败!"));
        delete m_pThread;
        m_pThread = nullptr;
    }
    else
    {
        m_pThread->m_bAutoDelete = FALSE; // 手动销毁线程对象
        AfxMessageBox(_T("线程已启动!"));
    }
}

LRESULT CMFCtestThreadDlg::OnTaskCompleted(WPARAM wParam, LPARAM lParam)
{
    int sum = static_cast<int>(wParam); // 获取结果
    CString strMessage;
    strMessage.Format(_T("线程任务完成,结果为:%d"), sum);
    AfxMessageBox(strMessage); // 显示结果

    // 清理线程
    if (m_pThread)
    {
        m_pThread->Delete(); 
        m_pThread = nullptr;
    }

    return 0;
}
相关推荐
FeboReigns29 分钟前
C++简明教程(4)(Hello World)
c语言·c++
FeboReigns30 分钟前
C++简明教程(10)(初识类)
c语言·开发语言·c++
zh路西法40 分钟前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
.Vcoistnt1 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
小k_不小1 小时前
C++面试八股文:指针与引用的区别
c++·面试
沐泽Mu1 小时前
嵌入式学习-QT-Day07
c++·qt·学习·命令模式
ALISHENGYA2 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
数据结构·c++·算法·图论
GOATLong2 小时前
c++智能指针
开发语言·c++
F-2H3 小时前
C语言:指针3(函数指针与指针函数)
linux·c语言·开发语言·c++