一个抽象的线程基类, 再来个具体的线程类并实现相关接口,再写个主函数来调用下。上代码:

Thread.h

/*
Windows平台线程类实现
开发环境: Win7_x64 + VC2012
*/
#ifndef __THREAD_H__
#define __THREAD_H__
#pragma once
#include <string>
#include <windows.h>
/*
1. 线程基类, 要创建新的线程类, 只需要继承此类并实现相关接口
2. 要开启线程并运行只需要调用Start()函数
3. 未完善地方: 应该写个虚函数Stop(), 当线程过程在运行时可以设置下运行标志变量让线程
退出循环过程, 再作些清理工作, 避免暴力终止线程。
*/
class CThread                               // 抽象的线程基类
{
public:
CThread(const std::string threadName = "noNamed");
virtual ~CThread();
virtual void Run() = 0;                    // 线程执行过程
virtual bool Start(bool bSuspended/* = false*/);
void Join(int timeout = -1);           // 等待超时时间为负时, 表示无限等待
void Resume();                          // 恢复挂起的线程
void Suspend();                         // 挂起线程
bool Terminate(unsigned long exitCode); // 结束线程
unsigned int GetThreadID();             // 获取线程ID
std::string GetThreadName();
void SetThreadName(std::string threadName);
private:
bool CreateThread(bool bSuspended = false);// 开始运行线程
static unsigned int WINAPI StaticThreadFunc(void* arg); // 线程函数
protected:
HANDLE          m_handle;
std::string     m_threadName;
unsigned int    m_threadID;
volatile bool   m_bRun;                 // 表明线程是否已成功创建(实际上与m_handle含义相同了)
};
#endif

Thread.cpp:

#include <iostream>
#include <process.h>
#include "Thread.h"
CThread::CThread(const std::string threadName)
: m_threadName(threadName), m_threadID(0), m_bRun(false)
{
}
CThread::~CThread()
{
printf("~CThread()\n");
}
bool CThread::Start(bool bSuspend/* = false*/)     // 创建线程并运行(默认)或挂起
{
m_bRun = CreateThread(bSuspend);
return m_bRun;
}
bool CThread::CreateThread(bool bSuspend/* = false*/)  // 创建线程并运行(默认)或挂起
{
if(!m_bRun)
{
if(bSuspend)
m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, CREATE_SUSPENDED, &m_threadID);
else
m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, 0, &m_threadID);
m_bRun = (NULL != m_handle);
}
return m_bRun;
}
void CThread::Join(int timeout/* = -1*/)           // 等待超时时间(毫秒)为负时, 表示无限等待
{
if(m_handle && m_bRun)
{
if(timeout < 0)
timeout = INFINITE;
::WaitForSingleObject(m_handle, timeout);
}
}
void CThread::Resume()                              // 恢复挂起的线程
{
if(m_handle && m_bRun)
::ResumeThread(m_handle);
}
void CThread::Suspend()                             // 挂起线程
{
if(m_handle && m_bRun)
::SuspendThread(m_handle);
}
bool CThread::Terminate(unsigned long exitCode)     // 结束线程
{
if(m_handle && m_bRun)
{
if(::TerminateThread(m_handle, exitCode))
{
::CloseHandle(m_handle);
m_handle = NULL;
m_bRun = false;
return true;
}
}
return false;
}
unsigned int CThread::GetThreadID()
{
return m_threadID;
}
std::string CThread::GetThreadName()
{
return m_threadName;
}
void CThread::SetThreadName(std::string threadName)
{
m_threadName = threadName;
}
unsigned int CThread::StaticThreadFunc(void* arg)       // 线程函数
{
CThread* pThread = (CThread*)arg;                  // 取得线程类指针
pThread->Run();                                      // 执行线程过程函数
return 0;
}

Thread1.h

#ifndef __THREAD1_H__
#define __THREAD1_H__
#pragma once
#include "Thread.h"
/*
1. 要创建一个新线程类时只需要继承CThread, 然后在Run()中实现自己的线程过程(Run())
*/
class CThread1: public CThread              // 线程类1
{
public:
CThread1(const std::string threadName = "noNamed");
virtual ~CThread1(void);
bool Start(bool bSuspended/* = false*/);
virtual void Run();
};
#endif

Thread1.cpp

#include <iostream>
#include "Thread1.h"
CThread1::CThread1(const std::string threadName): CThread(threadName)
{
}
CThread1::~CThread1()
{
printf("~CThread1()\n");
}
bool CThread1::Start(bool bSuspended/* = false*/)
{
// todo: 此处可添加一些初始化代码
return CThread::Start(bSuspended);
}
void CThread1::Run()
{
int cnt = 0;
while(cnt <= 10)
{
std::cout << "Hello " << m_threadName << "::Run(): " << cnt++ << std::endl;
Sleep(200);
}
}

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "Thread1.h"
#define N 15
int main(int argc, char* argv[])
{
char buf[20] = {0};
CThread* t[N] = {NULL};
for(int i = 0; i < N; i++)
{
sprintf(buf, "Thread%d", i+1);
t[i] = new CThread1(buf);
t[i]->Start(true);
std::cout << t[i]->GetThreadName() << ": " << t[i]->GetThreadID() << std::endl;
t[i]->Resume();
}
for(int i = 0; i < N; i++)
t[i]->Join();
return 0;
}

简单的C++线程类实现, windows平台相关推荐

  1. Delphi中的线程类

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...

  2. Delphi中的线程类Thread

    原文:http://www.heibai.net/article/info/info.php?infoid=22594 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数De ...

  3. DELPHI 线程类

    转自http://www.cnblogs.com/chengxin1982/archive/2009/10/04/1577879.html Delphi中有一个线程类TThread是用来实现多线程编程 ...

  4. Qt——线程类QThread

    本文主要介绍Qt中线程类QThread的用法,参考(翻译+修改)了一篇文章:PyQt: Threading Basics Tutorial,虽然使用的是PyQt,但与C++中Qt的用法大同小异,不必太 ...

  5. Windows平台RTMP播放器/RTSP播放器如何在播放窗口添加OSD文字叠加

    好多开发者在做Windows平台特别是单屏多画面显示时,希望像监控摄像机一样,可以在播放画面添加OSD台标,以实现字符叠加效果,大多开发者可很轻松的实现以上效果,针对此,本文以大牛直播SDK (Git ...

  6. Windows平台类毕业论文文献包含哪些?

    本文是为大家整理的Windows平台主题相关的10篇毕业论文文献,包括5篇期刊论文和5篇学位论文,为Windows平台选题相关人员撰写毕业论文提供参考. 1.[期刊论文]Windows平台恶意软件智能 ...

  7. 在Kubernetes上部署一个简单的、类PaaS的平台,原来这么容易!

    作者 | Bram Dingelstad 译者 | 弯月 责编 |徐威龙 封图| CSDN下载于视觉中国 我们都遇到过这种情况:有人发现了一个bug,然而这不是一般的软件bug,甚至都不是通常意义上的 ...

  8. Windows平台录音类封装:AudioRecordWindows

    文章目录 1 头文件 AudioRecordWindows.h 2 实现文件 AudioRecordWindows.cpp 3 调用Demo AudioRecordWindowsTest.cpp 自己 ...

  9. Gitea在windows平台的安装和简单使用教程

    Gitea在windows平台的安装和简单使用教程 一.Gitea简介 官网介绍:Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务.我们采用Go作为后端语言 ...

最新文章

  1. Linux 学习手记(1):命令行BASH的基本操作
  2. R语言可视化包ggplot2绘制甘特图(gantt chart)实战
  3. Python 基础 一
  4. Java多线程知识点整理(线程池)
  5. 深度学习核心技术精讲100篇(六十六)- 基于LXD的GPU算力虚拟化(附解决方案代码)
  6. 实现延时任务的 4 种实现方案!
  7. MoveAbsJ在使用时和MOVEJ有什么区别
  8. 使用PrimeFaces开发数据导出实用程序
  9. 如何变得聪明15种方法_变得聪明是什么感觉?
  10. u盘跑显卡维修测试软件,GPU Caps Viewer(显卡检测工具)
  11. 家里6只猫,我是如何分辨品种?前端程序员的AI识猫
  12. 尚学堂Struts视频总结之一
  13. 文件服务器mfs,MFS 分布式文件存储系统
  14. Oracle:Locked by transaction: console [表名]
  15. Android解析包时出现问题
  16. 班级小工具一【微信接龙】
  17. pyqtgraph帮助手册
  18. 莫纳什大学计算机专业在哪个校区,莫纳什大学校区几个
  19. screenocr怎么卸载_screenocr是什么软件 screenocr软件及其功能介绍
  20. 中国象棋软件-引擎实现(三)着法生成

热门文章

  1. 记一次曲折的jsp手工半盲注入
  2. 删除wallet里面登机牌_登机牌丢失问题
  3. leetcode 860. 柠檬水找零(贪心算法)
  4. 上海区块链会议演讲ppt_所以您想参加会议演讲吗? 这是我的建议。
  5. react 交互_如何在React应用程序中跟踪用户交互
  6. 如何使create-react-app与Node Back-end API一起使用
  7. 后端开发除了编码还要做什么_每个开发人员都应掌握的基本技能(除了编码)
  8. express-cli入门_使用Express.js入门
  9. 简述yolo1-yolo3_使用YOLO框架进行对象检测的综合指南-第二部分
  10. Android仿QQ复制昵称效果2