MFC - 封装CThread2
Thread.h
1 ////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // 封装线程类2 : Event 4 // 5 ////////////////////////////////////////////////////////////////////////////////////// 6 #ifndef __THREAD_H__ 7 #define __THREAD_H__ 8 9 #pragma once 10 11 #include <windows.h> 12 #include <process.h> 13 14 class CThread 15 { 16 public: 17 CThread(); 18 virtual ~CThread(); 19 20 public: 21 BOOL Start(); // 开始 22 BOOL Suspend(); // 挂起 23 BOOL Stop(); // 结束 24 virtual void Run() = 0; 25 26 private: 27 static UINT WINAPI ThreadProc(LPVOID param); 28 29 public: 30 HANDLE m_hThread; // 线程句柄 31 HANDLE m_hEvent; // 事件句柄 32 BOOL m_bExit; // TURE: 退出, FALSE: 运行 33 UINT m_nThreadAddr; 34 35 }; 36 37 #endif //__THREAD_H__
Thread.cpp
1 #include "stdafx.h" 2 #include "Thread.h" 3 4 5 CThread::CThread() :m_bExit(FALSE) 6 { 7 // 创建事件, 并设置为无信号状态 8 m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 9 10 // 创建线程 11 m_hThread = (HANDLE)_beginthreadex(NULL, 0, CThread::ThreadProc, this, 0, &m_nThreadAddr); 12 } 13 14 15 CThread::~CThread() 16 { 17 CloseHandle(m_hEvent); // 关闭事件句柄 18 CloseHandle(m_hThread); // 关闭线程句柄 19 } 20 21 // 线程函数 22 UINT WINAPI CThread::ThreadProc(LPVOID param) 23 { 24 CThread* pThread = static_cast<CThread*>(param); 25 while ( !pThread->m_bExit ) 26 { 27 WaitForSingleObject(pThread->m_hEvent, INFINITE); // 控制线程: 挂起 / 运行 28 pThread->Run(); // 派生类重载纯虚函数Run(),实际功能在派生类Run中实现 29 Sleep(5); 30 } 31 return 88; 32 } 33 34 // 开始 35 BOOL CThread::Start() 36 { 37 return SetEvent(m_hEvent); // 设置事件有信号 38 } 39 40 // 挂起 41 BOOL CThread::Suspend() 42 { 43 return ResetEvent(m_hEvent); // 设置事件无信号 44 } 45 46 // 结束 47 BOOL CThread::Stop() 48 { 49 m_bExit = TRUE; // 将线程状态置为: 退出 50 Start(); // 防御性编程: 把线程唤醒,防止阻塞在休眠处 51 WaitForSingleObject(m_hThread, INFINITE); // 等待线程退出 52 return TRUE; 53 }