zoukankan      html  css  js  c++  java
  • MFC

    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 }
  • 相关阅读:
    git使用
    silverlight与wcf双向通讯 例子
    Oracle 存储过程
    C# 视频教程
    佩服的技术大牛 “赵劼”
    setTimeout setInterval
    js闭包
    MVC Razor视图引擎控件
    MVC json
    springboot创建多环境profile打包
  • 原文地址:https://www.cnblogs.com/DuanLaoYe/p/5436353.html
Copyright © 2011-2022 走看看