转:一个跨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 ...
随机推荐
- Fedora下用Iptux,中文乱码解决
Ubuntu/Fedora下用Iptux与Windows下大飞鸽传书,中文乱码解决 问题描述: 在Ubuntu/Fedora下安装了Iptux后,再往Windows机器上发送文件或消息时,如果有中文, ...
- zookeeper_01:zookeeper概述
应对场景: 相对于开发在一台计算机上运行的单个程序,如何让一个应用中的多个独立的程序协同工作是一件非常困难的事情.开发这样的应用,很容易让很多开发人员陷入如何使多个程序协同工作的逻辑中,最后导致没有时 ...
- Eclipse导入jre方法
处理步骤:引入本机安装的jre1.8的步骤如下:
- Fragment之一:基本原理
1.低版本API对Fragment的支持 Fragment必须被加载进Acitivity中,才能呈现.而在低于3.0版本的API中,由于不存在Fragment,因此必须使用support包: (1)对 ...
- 如何用EXCEL表计算今天是本年的第几周?
单元格内输入如下代码计算出来的数字即是当日在本年度的第几周,如下: =INT((TODAY()-DATE(YEAR(TODAY()),1,1)-WEEKDAY(DATE(YEAR(TODAY()),1 ...
- mutex 和 spinlock 对比
理论上: mutex和spinlock都是用于多进程/线程间访问公共资源时保持同步用的,只 是在lock失败的时候处理方式有所不同.首先,当一个thread 给一个mutex上锁失败的时候,threa ...
- CodeForces 203C Photographer
简单贪心.注意内存够大,能满足所有顾客的特殊情况. #include <iostream> #include <cstring> #include <algorithm& ...
- FastReport.net 使用记录
FastReport.net 打印设计功能非常强大,打印内容可以自己设计.数据源可以来至许多个表,打印设计后的表格数据是以二进制保存在数据库中的. 1.打印设计: private void Desi ...
- Java连接Azure SQL Database
Azure SQL Database是Azure上的数据库PAAS服务,让用户可以快速的创建和使用SQL数据库而不用担心底层的备份,安全,运维,恢复等繁琐的工作,本文简单介绍如何使用Java程序连接到 ...
- VS调试时监视上一个错误代码和错误的文本描述
以前我都是用GetLastError()然后在MSDN里面查错误原因的.现在才知道有很简便的方法: 在Watch窗口选择一行,然后输入$err,hr