• 转:一个跨WINDOWS LINUX平台的线程类


     来源: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 = 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..
    ");
                return 0;
            }
    };
    
    int main(int argc, char* argv[])
    {
        CTest a;
        a.Start();
        
        //a.Detach(); //分离线程
        
        if (false == a.Join())
        {
            printf("join failed!
    ");
        }
        
        return 0;
    }
  • 相关阅读:
    (原创)C++ 同步队列
    (原创)用C++11的std::async代替线程的创建
    C语言宏应用-------#define STR(X) #X
    c++中数据表如何转成业务实体--map和结构体的相互转换
    线程池的陷阱
    java中map和对象互转工具类的实现示例
    3.python元类编程
    人生苦短,我用python(目录)
    11.多线程、多进程和线程池编程
    10.python3实用编程技巧进阶(五)
  • 原文地址:https://www.cnblogs.com/elonlee/p/3922758.html
Copyright © 2020-2023  润新知