前言
以下是一个简单的 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, ¶m);
}
//挂起线程
void CMFCtestThreadDlg::OnBnClickedButton8()
{
// TODO: 在此添加控件通知处理程序代码
tm.SuspendThread();
}
//恢复线程
void CMFCtestThreadDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
tm.ResumeThread();
}
//停止线程
void CMFCtestThreadDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码
tm.StopThread();
}