Bootstrap

MFC线程管理类

前言

以下是一个简单的 MFC 线程管理类的示例代码,它可以用于创建、启动、暂停、恢复以及停止线程,并获取线程的相关状态信息等。示例基于 Visual Studio 开发环境下的 MFC 应用程序框架编写:

头文件(ThreadManager.h

#pragma once

class ThreadManager
{
public:
	ThreadManager();
	~ThreadManager();

	// 创建并启动线程,参数为线程入口函数(函数指针类型需符合要求)和传递给线程函数的参数
	BOOL CreateAndStartThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam);
	// 暂停线程
	BOOL SuspendThread();
	// 恢复被暂停的线程
	BOOL ResumeThread();
	// 停止线程,等待线程安全退出
	BOOL StopThread();
	// 获取线程是否正在运行的状态
	BOOL IsRunning();
private:
	CWinThread* m_pThread;  // 指向创建的线程对象的指针
	HANDLE m_hThreadHandle; // 线程句柄,用于一些底层的线程操作
	BOOL m_bIsRunning;      // 标记线程是否正在运行
	BOOL m_bIsSuspend;      // 标记线程是否挂起
};

源文件(ThreadManager.cpp

#pragma once
#include "stdafx.h"
#include "ThreadManager.h"
#include <windows.h>

// 构造函数,初始化成员变量
ThreadManager::ThreadManager()
{
	m_pThread = NULL;
	m_hThreadHandle = NULL;
	m_bIsRunning = FALSE;
}

// 析构函数,释放相关资源,如果线程还在运行尝试停止它
ThreadManager::~ThreadManager()
{
	if (m_bIsRunning)
	{
		StopThread();
	}
	if (m_pThread != NULL)
	{
		delete m_pThread;
	}
}

// 创建并启动线程
BOOL ThreadManager::CreateAndStartThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam)
{
	// 使用AfxBeginThread创建线程
	m_pThread = AfxBeginThread(pfnThreadProc, pParam);
	if (m_pThread != NULL)
	{
		m_hThreadHandle = m_pThread->m_hThread;
		m_bIsRunning = TRUE;
		return TRUE;
	}
	return FALSE;
}

// 暂停线程
BOOL ThreadManager::SuspendThread()
{
	if (m_bIsRunning && m_hThreadHandle != NULL)
	{
		::SuspendThread(m_hThreadHandle);
		m_bIsSuspend = TRUE;
		return TRUE;
	}
	return FALSE;
}

// 恢复被暂停的线程
BOOL ThreadManager::ResumeThread()
{
	if (m_bIsRunning && m_hThreadHandle != NULL)
	{
		::ResumeThread(m_hThreadHandle);
		m_bIsSuspend = FALSE;
		return TRUE;
	}
	return FALSE;
}

// 停止线程,等待线程安全退出
BOOL ThreadManager::StopThread()
{
	if (m_bIsSuspend)
		ResumeThread();
	if (m_bIsRunning && m_hThreadHandle != NULL)
	{
		// 先设置一些标志(这里简单示例,可根据实际线程逻辑完善)让线程知道该结束了,然后等待线程结束
		m_bIsRunning = FALSE;
		::WaitForSingleObject(m_hThreadHandle, INFINITE);
		// 线程成功停止后,将 m_pThread 指针置为 NULL
		m_pThread = NULL;
		return TRUE;
	}
	return FALSE;
}

// 获取线程是否正在运行的状态
BOOL ThreadManager::IsRunning()
{
	return m_bIsRunning;
}

调用案例:

新建基于对话框的MFC程序,新增4个button控件,如下添加代码:

ThreadManager tm;
//注意头文件定义MyThreadProc时需要定义为static
UINT CMFCtestThreadDlg::MyThreadProc(LPVOID pParam)
{
	// 这里可以编写具体的线程执行逻辑,比如循环打印一些信息等
	for (int i = 0; i < 10; ++i)
	{
		if (!tm.IsRunning())
			break;
		CString strMsg;
		strMsg.Format(_T("线程正在运行,计数: %d  \n"), i);
		TRACE(strMsg);
		Sleep(1000);
	}
	return 0;
}
//开始线程
void CMFCtestThreadDlg::OnBnClickedButton4()
{
	int param = 0;  // 可以传递给线程函数的参数,这里简单示例为0
	// TODO: 在此添加控件通知处理程序代码
	tm.CreateAndStartThread(MyThreadProc, &param);

}
//挂起线程
void CMFCtestThreadDlg::OnBnClickedButton8()
{
	// TODO: 在此添加控件通知处理程序代码
	tm.SuspendThread();
}
//恢复线程
void CMFCtestThreadDlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	tm.ResumeThread();
}
//停止线程
void CMFCtestThreadDlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码
	tm.StopThread();
}

;