来源:http://blog.csdn.net/dengxu11/article/details/7232681

继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS LINUX平台的线程类

头文件 DXThread.h

#ifndef __DXTHREAD_H__
#define __DXTHREAD_H__ #define DX_WINDOWS //在WINDOWS上就打开它
//#define DX_LINUX //在LINUX 上就打开它 #ifdef DX_WINDOWS
#include <windows.h>
#define DX_CALLBACK WINAPI
typedef HANDLE DXHANDLE;
#endif #ifdef DX_LINUX
#include <pthread.h>
#define DX_CALLBACK
typedef pthread_t DXHANDLE;
#endif class CDXThread
{
public:
CDXThread();
virtual ~CDXThread();
virtual int Run();
bool Start();
bool Join();
bool Detach(); private:
static void* DX_CALLBACK RunThread(void* pParam);
DXHANDLE m_hThread;
void* m_pParam;
unsigned long m_nRet;
protected:
bool m_bStart;
int m_nState;
}; #endif //DXThread.h

//源文件  DXThread.cpp

#include "DXThread.h"

CDXThread::CDXThread()
{
m_hThread = NULL;
m_pParam = NULL;
m_nRet = ;
m_bStart = false;
m_nState = ;
} CDXThread::~CDXThread()
{
if (m_bStart && (m_nState == ))
{
Join();
}
} int CDXThread::Run()
{
return ;
} bool CDXThread::Start()
{
if (true == m_bStart)
return true; bool bOK = true;
m_bStart = true;
#ifdef DX_WINDOWS
if (NULL ==
(
m_hThread = CreateThread(NULL, ,
(unsigned long(DX_CALLBACK*)(void*))&RunThread, this, , NULL)
)
)
{
bOK = false;
}
#endif #ifdef DX_LINUX
if ( != pthread_create(&m_hThread, NULL, RunThread, this))
{
bOK = false;
}
#endif if (!bOK)
{
m_bStart = false;
return false;
} return true;
} bool CDXThread::Join()
{
if (!m_bStart)
return false; if (m_nState == )
return false; bool ret;
m_bStart = false; #ifdef DX_WINDOWS while ()
{
if (FALSE == GetExitCodeThread(m_hThread, &m_nRet))
{
ret = false;
break;
}
else
{
if (m_nRet == STILL_ACTIVE)
{
Sleep();
continue;
}
CloseHandle(m_hThread);
ret = true;
break;
}
} #endif #ifdef DX_LINUX
ret = ( == pthread_join(m_hThread, (void **)&m_nRet));
#endif m_hThread = NULL;
return ret;
} bool CDXThread::Detach()
{
if (!m_bStart)
return false; if (m_nState == )
return false; m_nState = ;
#ifdef DX_WINDOWS
return (TRUE == CloseHandle(m_hThread));
#endif #ifdef DX_LINUX
return ( == pthread_detach(m_hThread));
#endif } void* DX_CALLBACK CDXThread::RunThread(void* pParam)
{
CDXThread* pThis = (CDXThread*)pParam;
int nRet = pThis->Run();
return (void *)nRet;
}

//调用实例

#include <stdio.h>
#include "DXThread.h" class CTest : public CDXThread
{
public:
int Run()
{
printf("1..\n");
return ;
}
}; int main(int argc, char* argv[])
{
CTest a;
a.Start(); //a.Detach(); //分离线程 if (false == a.Join())
{
printf("join failed!\n");
} return ;
}

转:一个跨WINDOWS LINUX平台的线程类的更多相关文章

  1. pycharm 更换源 Windows Linux平台

    pycharm 更换源 Windows Linux平台 参考资料:https://blog.csdn.net/wls666/article/details/95456309 Windows下更新源 文 ...

  2. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接

    <一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值 ...

  3. Redis在Windows+linux平台下的安装配置(转)

    window平台Redis安装 下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload Redis文件夹有以下几个文 ...

  4. Linux平台下线程池的原理及实现

    转自:http://blog.csdn.net/lmh12506/article/details/7753952 前段时间在github上开了个库,准备实现自己的线程池的,因为换工作的事,一直也没有实 ...

  5. centos8:linux平台查看线程(ps/pstree/top)

    一,ps/pstree/top命令所属的rpm包 pstree所属的包 [root@blog ~]# whereis pstree pstree: /usr/bin/pstree /usr/bin/p ...

  6. 在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

    在 Linux 平台及 IPv4 环境中构建 IPv6 测试环境 1 IPv6简介 IPv6(Internet Protocol Version 6)作为 IPv4 的升级版本,它是作为一共软件升级安 ...

  7. 如何配置一个路径,能够既适合Linux平台,又适合Windows平台,可以从这个路径中读取文件

    如何配置一个路径,能够既适合Linux平台,又适合Windows平台,可以从这个路径中读取文件? 目的:就是希望在项目的配置文件中配上一样的路径,不管协作者使用的是什么平台,都能够读到文件. 比如:L ...

  8. Thrift在Windows及Linux平台下的安装和使用示例

    本文章也同时发表在个人博客Thrift在Windows及Linux平台下的安装和使用示例上. thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的R ...

  9. Windows及Linux平台下的计时函数总结

    本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的各种函数.比如Window平台下特有的Windows API函数GetTickCount().timeG ...

随机推荐

  1. HDU 1057 - A New Growth Industry

    简单的模拟. 给定天数n,给定D[0]~D[15]给定一个20*20的矩阵.每个格子内有一个0~3的数字,表示细菌数.每天,每个格子将加上D[k],k表示这个格子以及上下左右相邻格子的细菌之和(矩阵外 ...

  2. I - Long Distance Racing(第二季水)

    Description Bessie is training for her next race by running on a path that includes hills so that sh ...

  3. Struts2 校验

    Struts2校验格式: actionName-methodName-invalidation.xml  该配置文件必须和action类在同一个包下. <?xml version="1 ...

  4. 通过Wmi实现Hyper-V远程管理(一)

    最近公司需要做Hyper-V的远程管理,在现有产品基础上扩展对Hyper V的管理,实现远程开关机.远程开启虚拟机会话,其他内容可查看MSDN中有对Hyper-V的描述和相关实例代码. Wmi操作hy ...

  5. UVA 1839 Alignment

    还是最长上升子序列... 本题是求队列中任一士兵都能从左边或者右边看到队伍外: 即某一士兵左边为上升子序列,右边为下降子序列.求两个序列和,再用总数减去: #include <iostream& ...

  6. js中一些常用的基本函数

    如何使用jquery刷新当前页面下面介绍全页面刷新方法:有时候可能会用到window.location.reload()刷新当前页面.parent.location.reload()刷新父亲对象(用于 ...

  7. javascript 事件设计模式

    http://plkong.iteye.com/blog/213543 1. 事件设计概述 事件机制可以是程序逻辑更加清晰可见,在JavaScript中很多对象都有自己的事件,如:button有onc ...

  8. Elf 32

    [CentOS]安装软件:/ld-linux.so.2: ELF interpreter解决   环境: [orangle@localhost Downloads]$ uname -m&&am ...

  9. DotNet 资源大全(Awesome最新版)

    发表时间:2016-09-20 21:34:58   编辑:机器猫   阅读:136次   目录 API 应用框架(Application Frameworks) 应用模板(Application T ...

  10. MarkDown基础使用教程-by sixleaves

    以下是个人浏览文档,结合自己平时使用所总结, 和引用国外关于如何使用markdown的教程.如有不足,还请海涵,期待于您的交流.我觉得使用markdown书写挺好的! 工具下载,可以去下载gitboo ...