/********************************************************************/
* @file
* @author def< qq group: 324164944 >
* @blog http://www.cnblogs.com/itdef/
* @brief
/********************************************************************/

/*******************************************************************************
* @file
* @author def< qq group: 324164944 >
* @blog http://www.cnblogs.com/itdef/
* @brief
/*******************************************************************************/ #include "stdafx.h"
#include <iostream>
#include <windows.h> using namespace std; class CThread{
public:
CThread();
virtual ~CThread();
bool Start();
void Join();
static DWORD WINAPI ThreadProc( LPVOID lpParameter);
virtual void Run() = 0;
private:
HANDLE hThread_;
DWORD dwThreadId_;
}; CThread::CThread():
hThread_(NULL),dwThreadId_(0)
{
cout << "Thread ..." << endl;
} CThread::~CThread()
{
if(hThread_ != NULL)
CloseHandle(hThread_);
cout << "~Thread ..." << endl;
} bool CThread::Start()
{
bool bRet = false;
hThread_ = CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc, // thread function
this, // argument to thread function
0, // use default creation flags
&dwThreadId_); // returns the thread identifier if(hThread_)
{
bRet = true;
}
return bRet;
} void CThread::Join()
{
WaitForSingleObject(hThread_,3000);
} DWORD CThread::ThreadProc( LPVOID lpParameter)
{
CThread* thread = static_cast<CThread*>(lpParameter);
thread->Run();
return NULL;
} class CMyThread:public CThread
{
public:
void Run(){ cout << "my thread..." << endl;}
}; int _tmain(int argc, _TCHAR* argv[])
{
  CMyThread thread;
  thread.Start();  
  thread.Join();
  return 0;
}

  

基类是最基本的几个元素 线程ID 创建进程的函数start 运行指定的线程函数run  以及等待函数join()

使用的时候直接继承 在run函数中执行自己想执行的线程处理即可。

基于对象则未使用继承等特性,使用bind function这对利器 来实现回调

#include <windows.h>
#include <iostream>
#include <boost/function.hpp> class CThread
{
public:
typedef boost::function<void ()> ThreadFunc;
explicit CThread(const ThreadFunc& func);
~CThread(); void Start();
void Join();
private:
static DWORD WINAPI ThreadProc(LPVOID arg);
void Run();
ThreadFunc func_;
HANDLE hThread_; }; void CThread::Start()
{
hThread_ = CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc, // thread function
this, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
} CThread::CThread(const ThreadFunc& func):
hThread_(NULL),func_(func)
{
std::cout << "CThread()..." << std::endl;
} void CThread::Join()
{
WaitForSingleObject(hThread_,3000);
} CThread::~CThread()
{
if(hThread_)
CloseHandle(hThread_);
std::cout << "~CThread()..." << std::endl;
} void CThread::Run()
{
func_();
} DWORD CThread::ThreadProc(LPVOID arg)
{
CThread* thread = static_cast<CThread*>(arg);
thread->Run();
return NULL;
} //====================================== void ThreadFunc()
{
std::cout << "Enter thread function ...." << std::endl;
} int _tmain(int argc, _TCHAR* argv[])
{
CThread thread(ThreadFunc);
thread.Start();
thread.Join();
return 0;
}

  

面向对象与基于对象 学习记录 thread举例的更多相关文章

  1. Git 教程 -- 基于自己学习记录

    Git 教程 -- 基于自己学习记录 1. 引言 由于学校布置了一项熟悉 git 和 svn 操作的实验,所以自己重新温习了下 git,记录过程在这. 2. 注册登录 GitHub. 3. 选择一个仓 ...

  2. JS是面向过程、面向对象还是基于对象?面向对象的代码体现

    一.问题 javascript是面向对象的,还是面向过程的?基于对象是什么意思? 对象: 指的是对某一类事物进行抽象,抽象出这一类事物共同的特征以及行为(也就是属性和方法),那些拥有这一共同属性和方法 ...

  3. SVN教程 -- 基于自己学习记录

    SVN教程 -- 基于自己学习记录 1. 概述 a. 什么是SVN? Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统.相较于 git ,svn 是集中式版本控 ...

  4. 重学前端--js是面向对象还是基于对象?

    重学前端-面向对象 跟着winter老师一起,重新认识前端的知识框架 js面向对象或基于对象编程 以前感觉这两个在本质上没有什么区别,面向对象和基于对象都是对一个抽象的对象拥有一系列的行为和状态,本质 ...

  5. 流畅的python第九章符合Python风格的对象学习记录

    对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python提供了两种方式 repr()便于开发者理解的方式返回对象的字符串表示形式 str()便于用户理解的方式返回对 ...

  6. jsp内置对象学习记录

    1.session,是一个会话保留在服务器端的对象(默认保留时间为30分钟),所以我们可以在session里面放用户信息以便后续的访问便利(缺点:cookie劫持,导致用户数据泄露).案例:(1)同个 ...

  7. C++11新特性,bind,基于对象

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  8. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  9. Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...

随机推荐

  1. stdio.h头文件中申明的基本函数

    调用scanf函数时,需传入变量的地址作为参数,scanf函数会等待标准输入设备(键盘等)输入数据,并且将输入的数据赋值给地址对应的变量. #include<stdio.h> #inclu ...

  2. chrome浏览器控制台 console不打印信息问题解决办法。

    转自:https://blog.csdn.net/wang17866603359/article/details/79083776 最近换了安装chrome,想按F12调试下代码,发现控制台什么信息都 ...

  3. delphi 加密 XOR

    From  http://www.delphigeist.com/2009/09/text-encryption-with-xor.html Text encryption with XOR   Ev ...

  4. static 和 global

    global global关键字如果用在function内部,则说明这个function内用的这个变量是全局的,全局变量就是在整个页面里都能起作用.例如 $conf = 1; function con ...

  5. as3 air 保存文本内容的换行

    private function newData() { var str:String="<root>"; for(var i in charCode_arr) { s ...

  6. 前端-jQuery的ajax方法

    https://www.cnblogs.com/majj/p/9134922.html 0.什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascri ...

  7. Spring MVC 接受的请求参数

    目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...

  8. 练习:自己写一个容器ArrayList集合 一一数组综合练习2

    package cn.bjsxt.collection; /** * 自己实现一个ArrayList */ import java.util.ArrayList; import java.util.L ...

  9. 吴裕雄 数据挖掘与分析案例实战(5)——python数据可视化

    # 饼图的绘制# 导入第三方模块import matplotlibimport matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['S ...

  10. pyplot图像组件

    pyplot图像组件 ax子对象的组件内容 Title 图表标题 plt.title() Axis 坐标范围,x轴,y轴 plt.axis() label 坐标轴标注 plt.xlabel() plt ...