简单的C++线程类实现, windows平台
一个抽象的线程基类, 再来个具体的线程类并实现相关接口,再写个主函数来调用下。上代码:
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平台相关推荐
- Delphi中的线程类
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...
- Delphi中的线程类Thread
原文:http://www.heibai.net/article/info/info.php?infoid=22594 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数De ...
- DELPHI 线程类
转自http://www.cnblogs.com/chengxin1982/archive/2009/10/04/1577879.html Delphi中有一个线程类TThread是用来实现多线程编程 ...
- Qt——线程类QThread
本文主要介绍Qt中线程类QThread的用法,参考(翻译+修改)了一篇文章:PyQt: Threading Basics Tutorial,虽然使用的是PyQt,但与C++中Qt的用法大同小异,不必太 ...
- Windows平台RTMP播放器/RTSP播放器如何在播放窗口添加OSD文字叠加
好多开发者在做Windows平台特别是单屏多画面显示时,希望像监控摄像机一样,可以在播放画面添加OSD台标,以实现字符叠加效果,大多开发者可很轻松的实现以上效果,针对此,本文以大牛直播SDK (Git ...
- Windows平台类毕业论文文献包含哪些?
本文是为大家整理的Windows平台主题相关的10篇毕业论文文献,包括5篇期刊论文和5篇学位论文,为Windows平台选题相关人员撰写毕业论文提供参考. 1.[期刊论文]Windows平台恶意软件智能 ...
- 在Kubernetes上部署一个简单的、类PaaS的平台,原来这么容易!
作者 | Bram Dingelstad 译者 | 弯月 责编 |徐威龙 封图| CSDN下载于视觉中国 我们都遇到过这种情况:有人发现了一个bug,然而这不是一般的软件bug,甚至都不是通常意义上的 ...
- Windows平台录音类封装:AudioRecordWindows
文章目录 1 头文件 AudioRecordWindows.h 2 实现文件 AudioRecordWindows.cpp 3 调用Demo AudioRecordWindowsTest.cpp 自己 ...
- Gitea在windows平台的安装和简单使用教程
Gitea在windows平台的安装和简单使用教程 一.Gitea简介 官网介绍:Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务.我们采用Go作为后端语言 ...
最新文章
- Linux 学习手记(1):命令行BASH的基本操作
- R语言可视化包ggplot2绘制甘特图(gantt chart)实战
- Python 基础 一
- Java多线程知识点整理(线程池)
- 深度学习核心技术精讲100篇(六十六)- 基于LXD的GPU算力虚拟化(附解决方案代码)
- 实现延时任务的 4 种实现方案!
- MoveAbsJ在使用时和MOVEJ有什么区别
- 使用PrimeFaces开发数据导出实用程序
- 如何变得聪明15种方法_变得聪明是什么感觉?
- u盘跑显卡维修测试软件,GPU Caps Viewer(显卡检测工具)
- 家里6只猫,我是如何分辨品种?前端程序员的AI识猫
- 尚学堂Struts视频总结之一
- 文件服务器mfs,MFS 分布式文件存储系统
- Oracle:Locked by transaction: console [表名]
- Android解析包时出现问题
- 班级小工具一【微信接龙】
- pyqtgraph帮助手册
- 莫纳什大学计算机专业在哪个校区,莫纳什大学校区几个
- screenocr怎么卸载_screenocr是什么软件 screenocr软件及其功能介绍
- 中国象棋软件-引擎实现(三)着法生成
热门文章
- 记一次曲折的jsp手工半盲注入
- 删除wallet里面登机牌_登机牌丢失问题
- leetcode 860. 柠檬水找零(贪心算法)
- 上海区块链会议演讲ppt_所以您想参加会议演讲吗? 这是我的建议。
- react 交互_如何在React应用程序中跟踪用户交互
- 如何使create-react-app与Node Back-end API一起使用
- 后端开发除了编码还要做什么_每个开发人员都应掌握的基本技能(除了编码)
- express-cli入门_使用Express.js入门
- 简述yolo1-yolo3_使用YOLO框架进行对象检测的综合指南-第二部分
- Android仿QQ复制昵称效果2