转:一个跨WINDOWS LINUX平台的线程类
继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平台的线程类的更多相关文章
- pycharm 更换源 Windows Linux平台
pycharm 更换源 Windows Linux平台 参考资料:https://blog.csdn.net/wls666/article/details/95456309 Windows下更新源 文 ...
- MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接
<一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值 ...
- Redis在Windows+linux平台下的安装配置(转)
window平台Redis安装 下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload Redis文件夹有以下几个文 ...
- Linux平台下线程池的原理及实现
转自:http://blog.csdn.net/lmh12506/article/details/7753952 前段时间在github上开了个库,准备实现自己的线程池的,因为换工作的事,一直也没有实 ...
- centos8:linux平台查看线程(ps/pstree/top)
一,ps/pstree/top命令所属的rpm包 pstree所属的包 [root@blog ~]# whereis pstree pstree: /usr/bin/pstree /usr/bin/p ...
- 在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境
在 Linux 平台及 IPv4 环境中构建 IPv6 测试环境 1 IPv6简介 IPv6(Internet Protocol Version 6)作为 IPv4 的升级版本,它是作为一共软件升级安 ...
- 如何配置一个路径,能够既适合Linux平台,又适合Windows平台,可以从这个路径中读取文件
如何配置一个路径,能够既适合Linux平台,又适合Windows平台,可以从这个路径中读取文件? 目的:就是希望在项目的配置文件中配上一样的路径,不管协作者使用的是什么平台,都能够读到文件. 比如:L ...
- Thrift在Windows及Linux平台下的安装和使用示例
本文章也同时发表在个人博客Thrift在Windows及Linux平台下的安装和使用示例上. thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的R ...
- Windows及Linux平台下的计时函数总结
本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的各种函数.比如Window平台下特有的Windows API函数GetTickCount().timeG ...
随机推荐
- c#&.NET3.0高级程序设计-02 Enum Demo
Enum 实例 using System; using System.Collections.Generic; public class MyClass { enum EmpType ...
- php中的短标签 太坑人了
今天配置了一个php页面去修改svn密码问题,结果调了半天,最后在Windows和 Linux的运行现象是不一样,运行结果更不一样了,关键是完全一模一样的代码. 最后发现是短标签引起的,Windows ...
- Android中Menu的基本用法
一. 使用xml定义Menu 菜单资源文件必须放在res/menu目录中.菜单资源文件必须使用<menu>标签作为根节点.除了<menu>标签外,还有另外两个标签用于设置菜单项 ...
- Unique Binary Search Trees,Unique Binary Search Trees II
Unique Binary Search Trees Total Accepted: 69271 Total Submissions: 191174 Difficulty: Medium Given ...
- php 支持递归函数.递归函数就是调用函数本身.
例子 将一个字符进行颠倒 function reverse_r($str){ if(strlen($str)){ reverse_r(substr($str,1));// } echo substr( ...
- python运维开发(十)----IO多路复用线程基本使用
内容目录: python作用域 python2.7和python3.5的多继承区别 IO多路复用 socketserver模块源分析 多线程.进程.协程 python作用域 python中无块级作用 ...
- webpack图片的路径与打包
转的http://www.cnblogs.com/ghost-xyx/p/5812902.html 今天写 react遇到打包图片,之前都是通过url在css里,没遇到问题,今天在 react里直接用 ...
- C语言的本质(13)——指向指针的指针
指针可以指向基本类型,也可以指向复合类型,因此一个指针变量存放的可以是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量.由于指针变量直接指向变量,所以称为"单级间址".而 ...
- iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
1. 来自 http://blog.csdn.net/fanjunxi1990/article/details/9352917 XCode工程目录里面,有时你会发现2个不同颜色的文件夹,一种是蓝色的, ...
- 深入了解 Flexbox 伸缩盒模型
Flexbox(伸缩布局盒) 是 CSS3 中一个新的布局模式,为了现代网络中更为复杂的网页需求而设计.本文将介绍 Flexbox 语法的技术细节.浏览器的支持越来越快,所以当 Flexbox 被广泛 ...