libuv封装线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lightjia/article/details/84324864
#ifndef __CUVTHREAD__H_
#define __CUVTHREAD__H_
#include "uv.h"
#include "UvSem.h"
#include "CLogmanager.h"
class CUvThread{
public:
    CUvThread();
    virtual ~CUvThread();

public:
    int Start();
    int Quit();
    void Wait();
    void Activate();

public:
    static void ThreadEntry(void *pParam);

protected:
    virtual int OnThreadRun() = 0;
    virtual int OnCreate();
    virtual int OnQuit();
    virtual int OnDestroy();

protected:
    bool mbQuit;

private:
    uv_thread_t mstThread;
    CUvSem mcUvSem;
    bool m_bInit;
};

#endif



#include "UvThread.h"

CUvThread::CUvThread(){
    m_bInit = false;
    mbQuit = false;
}

CUvThread::~CUvThread(){
    Quit();
}

void CUvThread::ThreadEntry(void *pParam) {
    if (nullptr != pParam) {
        CUvThread* pUvThread = reinterpret_cast<CUvThread*>(pParam);
        if (nullptr != pUvThread) {
            pUvThread->m_bInit = true;
            pUvThread->OnThreadRun();
            pUvThread->OnQuit();
        }
    }
}

int CUvThread::Start() {
    ASSERT_RET_VALUE(m_bInit == false, 1);
    OnCreate();
    if (uv_thread_create(&mstThread, CUvThread::ThreadEntry, (void*)this) != 0){
        LOG_ERR("uv_thread_create error");
        return 1;
    }

    while (!m_bInit) {
        sleep_ms(10);
    }

    return 0;
}

int CUvThread::Quit() {
    mbQuit = true;
    if (m_bInit) {
        uv_thread_join(&mstThread);
        m_bInit = false;
        return OnDestroy();
    }

    return 0;
}

int CUvThread::OnCreate() {
    LOG_INFO("Enter CUvThread::OnCreate");
    return 0;
}

int CUvThread::OnQuit() {
    LOG_INFO("Enter CUvThread::OnQuit");
    return 0;
}

int CUvThread::OnDestroy() {
    LOG_INFO("Enter CUvThread::OnDestroy");
    return 0;
}

void CUvThread::Wait() {
    mcUvSem.Wait();
}

void CUvThread::Activate() {
    mcUvSem.Post();
}

猜你喜欢

转载自blog.csdn.net/lightjia/article/details/84324864