Linux下的主动对象类的实现

#pragma once
#include <pthread.h>
class ThreadWrapper
{
public:
    virtual ~ThreadWrapper();
    static void EnterFunc(void *p);
    int Open();
    int Close();
    bool TestCancel();
    void Wait();
    virtual void Svc();

protected:
    ThreadWrapper();

private:
    bool m_stillOpen;
    int m_threadNum;
    pthread_t m_handle;
};

 

 

*************************************************

#include "ThreadWrapper.h"

ThreadWrapper::ThreadWrapper()
: m_stillOpen(false)
{}

ThreadWrapper::~ThreadWrapper()
{
    if(m_stillOpen)
    {
        Close();
        Wait();
    }
}
/*
Functional: The enter function of the thread.
*/
void ThreadWrapper::EnterFunc (void *p)
{
    ThreadWrapper* bp = static_cast <ThreadWrapper*> (p);
     bp->Svc();
}

/*
Functional: Create the thread.
*/
int ThreadWrapper::Open ()
{
    m_threadNum = threadNum;
    int ret = pthread_create(&m_handle, NULL, EnterFunc, this);
    if (ret != 0)
   {
       return -1;
    }

    m_stillOpen = true;
    return 0;
}

 

int ThreadWrapper::Close()
{
    pthread_cancel(m_handle);
    m_stillOpen = false;
    return 1;
}

 

void ThreadWrapper::TestCancel()
{
     pthread_testcancel();
}

 

void ThreadWrapper::Wait()
{
    pthread_join(m_handle, NULL);
    m_stillOpen = false;
}

void ThreadWrapper::Svc()
{}

 

此主动对象的用法如下:

1:先定义主动对象类,派生自ThreadWrapper即可,然后实现Svc()虚方法

class Sample : Public ThreadWrapper

{

public:

    virtual void Svc()

    {

       ...// add anything you wanna do, and TestCancel() can be positioned somewhere 

    }

}

2:定义Sample对象,然后open.....

Sample sample;

sample.open();  // 此句执行后线程就开始执行了,即Sample::Svc()开始执行

......

sample.close(); // 主动关闭线程

sample.wait();  // 等待Sample对象的线程执行完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值