一个跨WINDOWS LINUX平台的线程类

22 篇文章 0 订阅
21 篇文章 0 订阅

继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 = 0;  
    m_bStart = false;
    m_nState = 0;
}  

CDXThread::~CDXThread()  
{
    if (m_bStart && (m_nState == 0))
    {
        Join();
    }
}  

int CDXThread::Run()  
{  
    return 0;  
}  

bool CDXThread::Start()  
{
    if (true == m_bStart)
        return true;

    bool bOK = true;
    m_bStart = true;
#ifdef DX_WINDOWS
    if (NULL == 
            (
             m_hThread = CreateThread(NULL, 0, 
                 (unsigned long(DX_CALLBACK*)(void*))&RunThread, this, 0, NULL)
             )
        )
    {
        bOK = false;
    }
#endif

#ifdef DX_LINUX
    if (0 != 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 == 1)
        return false;

    bool ret;
    m_bStart = false;

#ifdef DX_WINDOWS
    
    while (1)
    {
        if (FALSE == GetExitCodeThread(m_hThread, &m_nRet))  
        {
            ret = false;
            break;
        }
        else  
        {
            if (m_nRet == STILL_ACTIVE)
            {
                Sleep(100);
                continue;
            }
            CloseHandle(m_hThread);
            ret = true;
            break;
        }
    }

#endif

#ifdef DX_LINUX
    ret = (0 == pthread_join(m_hThread, (void **)&m_nRet));
#endif

    m_hThread = NULL;
    return ret;
}  

bool CDXThread::Detach()
{
    if (!m_bStart)
        return false;

    if (m_nState == 1)
        return false;

    m_nState = 1;
#ifdef DX_WINDOWS
    return (TRUE == CloseHandle(m_hThread));
#endif
    
#ifdef DX_LINUX
    return (0 == 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 0;
        }
};

int main(int argc, char* argv[])
{
    CTest a;
    a.Start();
    
    //a.Detach(); //分离线程
    
    if (false == a.Join())
    {
        printf("join failed!\n");
    }
    
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值