/********************************************************************/
* @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. 局部敏感哈希-Locality Sensitivity Hashing

    一. 近邻搜索 从这里开始我将会对LSH进行一番长篇大论.因为这只是一篇博文,并不是论文.我觉得一篇好的博文是尽可能让人看懂,它对语言的要求并没有像论文那么严格,因此它可以有更强的表现力. 局部敏感哈 ...

  2. Zabbix结合Grafana绘图

    参考网站: https://www.jianshu.com/p/6eec985c5c94 注意事项: 1.在ganafa添加datasource的时候url写成http://10.116.33.116 ...

  3. 42. linux下数据库服务启动

    进到bin目录运行 emctl start dbconsole oracle@suse92:~> sqlplus /nolog SQL*Plus: Release 9.2.0.4.0 - Pro ...

  4. jetty异常

    异常一: java.net.BindException: Address already in use: bind jvm 1 | 2017-10-18 15:08:10,792+0800 WARN ...

  5. Simple2D-26 Simple2D 最后的工作,开发结束

    开始的时候打算将 Simple2D 做成一个库的,但现在没有那个功夫了. 要渲染顶点数据,就必须将渲染函数放置到 glClear( ) 函数和 SwapBuffers( ) 函数之间,但又不希望开发时 ...

  6. Django之 Model Field Options

    以下这些选项都是可选择的,非固定要求. 1)null,注意在CharField或者TextField里避免使用null,因为其存储的值是空字符串而不是NULL 2)blank该字段是否可以为空.如果为 ...

  7. 如何将int整型转换成String字符串类型

    自动类型转换适用于兼容类型之间从小范围到大范围数据的转换. nt转换成String int i = 10; int b=1: System.out.pritnln(a + b); 里面靠近字符串,所以 ...

  8. 编写一个带有main函数的类,调用上面的汽车类,实例化奔驰、大众、丰田等不同品牌和型号,模拟开车过程:启动、加速、转弯、刹车、息火,实时显示速度。

    //程序入口    public static void main(String[] args) {        // TODO Auto-generated method stub         ...

  9. 预习 jdbc 技术简介

    JDBC简介: JDBC全称为java database connectivity,是sun公司指定的java数据库连接技术的简称. 他是sun公司和数据库开发商共同开发出来的独立于DBMS的应用程序 ...

  10. python处理分隔大文件

    4个.sql格式的文件,2G大小,直接插入mysql数据中,文件太大了,导入不进去. 太大的文件用python处理也很麻烦,处理不了,只能先分隔成小文件处理. 文件中数据格式:其中values里面的数 ...