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 }

 

posted @ 2016-04-26 19:46  C/C++/Python/Java  阅读(379)  评论(0编辑  收藏  举报