封装一个Window线程类

来源:互联网 发布:java多线程实现同步 编辑:程序博客网 时间:2024/06/11 04:33

概述

封装一个简单的线程类,线程函数结束后线程不会自动退出,而是阻塞到了事件函数上,当再次运行该线程时,会触发事件解除阻塞运行函数而不会重新创建线程。想要使线程退出,必须手动设置线程才会退出。

有两个CThreadCThreadFunc其中CThread是主要的线程类,它保存线程句柄和线程ID等属性,CThreadFunc是线程处理函数类,处理线程的具体工作。

实现的方法有两种,一种是直接继承CThread并重写它的Run函数。另一种是先实例化CThread thread接着创建一个线程函数类继承CThreadFunc并重写Run函数。然后调用thread的函数AddWorkThread()把线程函数对象添加到线程中


源码

CThread.h

#include <stdio.h>  #include <process.h>  #include <windows.h>#include <stdlib.h>#include <iostream>#include "CThreadFunc.h"class CThread{public:CThread();~CThread();//开始线程bool Start();//阻塞等待子线程结束void join(int timeout = -1);//运行函数virtual void Run();//设置线程退出void SetThreadEnd();//添加工作线程类void AddWorkThread(CThreadFunc *cThreadFunc);//激活线程void CThread::Resume();//挂起线程void CThread::Suspend();private:static unsigned int WINAPI StaticThreadFunc(void *arg);private:unsigned int m_ThreadID;//线程IDchar *m_Name;//线程名称HANDLE m_Handle;//线程句柄bool m_Run;//线程是否正在运行bool m_isEnd;//是否结束线程CThreadFunc *m_pThreadFunc;//线程函数类HANDLE  g_hThreadEvent;//事件};

CThread.cpp

#include "CThread.h"CThread::CThread(){//线程句柄m_Handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, 0, &m_ThreadID);m_ThreadID = -1;//线程IDm_Name = NULL;//线程名称m_Run = false;//线程是否运行m_pThreadFunc = NULL;//线程函数类//初始化事件g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);}CThread::~CThread(){}unsigned int CThread::StaticThreadFunc(void *arg){CThread *thread = (CThread *)arg;while (true){thread->m_Run = false;WaitForSingleObject(thread->g_hThreadEvent, INFINITE); //等待事件被触发 thread->m_Run = true;if (thread->m_pThreadFunc != NULL){thread->m_pThreadFunc->Run();}else{thread->Run();//线程处理函数}if (thread->m_isEnd)//是否推出线程{break;}}return 0;}//开始线程bool CThread::Start(){//如果线程正在运行则返回if (m_Run || NULL == m_Handle){return -1;}m_Run = true;//重置标志位SetEvent(g_hThreadEvent);//触发事件 return m_Run;}//阻塞等待子线程结束void CThread::join(int timeout){if (NULL == m_Handle || !m_Run){return;}if (timeout <= 0){timeout = INFINITE;}//阻塞等待线程结束::WaitForSingleObject(m_Handle, timeout);}//设置线程退出void CThread::SetThreadEnd(){m_isEnd = true;}//添加工作线程类void CThread::AddWorkThread(CThreadFunc *cThreadFunc){m_pThreadFunc = cThreadFunc;//线程函数类}//激活线程void CThread::Resume(){if (NULL == m_Handle || !m_Run){return;}::ResumeThread(m_Handle);}//挂起线程void CThread::Suspend(){if (NULL == m_Handle || m_Run){return;}::SuspendThread(m_Handle);}//运行函数void CThread::Run(){}

CThreadFunc.h

#pragma onceclass CThreadFunc{public:CThreadFunc();~CThreadFunc();virtual void Run() = 0;};

CThreadFunc.cpp

#include "CThreadFunc.h"CThreadFunc::CThreadFunc(){}CThreadFunc::~CThreadFunc(){}

方法一
#include <stdio.h>#include "CThread.h"#include "CThreadFunc.h"class thread : public CThread{public:thread(){}~thread(){}virtual void Run(){int i = 5;while (i){Sleep(1000);std::cout << "hello world\n";i--;}}};int main(void){thread *t = new thread;t->Start();t->SetThreadEnd();t->join();std::cout << "子线程结束\n";getchar();return 0;}

方法二
#include "CThread.h"#include "CThreadFunc.h"class Func :public CThreadFunc{public:virtual void Run(){int i = 5;while (i){Sleep(1000);std::cout << "object Thread\n";i--;}}};int main(void){CThread *t = new thread;Func *f = new Func;t->AddWorkThread(f);t->Start();t->SetThreadEnd();t->join();std::cout << "子线程结束\n";getchar();return 0;}

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 冠琴怎么样 冠琴女士手表价格 冠琴男士机械表 冠琴手表真伪查询 冠琴手表皮带 冠琴的表怎么样 冠琴手表咋样 冠琴的手表怎么样 冠琴手表怎么样啊 冠琴的机械表怎么样 冠琴手表质量如何 冠琴表业有限公司 冠琴手表专卖店 冠琴超薄手表 冠琴商务手表 冠琴手表7d0283 冠琴皮带手表 冠琴手表大全 宾格好还是冠琴好 冠琴机械手表怎么样 冠琴手表怎么查真伪 冠琴手表男 海琴和冠琴 冠琴手表是名牌吗 冠琴怎么换表带 冠琴表怎么调时间 冠琴手表和宾格手表哪个好 冠琴手表真假 冠琴手表型号 冠琴表怎么换表带 冠琴手表是哪里生产的 冠琴手表哪产的 冠琴手表女 冠琴手表产地 冠琴和天梭 冠琴手表标志 冠琴手表价格及图片 冠琴的手表好吗 冠琴手表和宾格手表 冠琴手表怎么看型号 冠琴手表型号怎么看