C++ 线程类的一个实现

.h

#ifndef CTHREAD_H_
#define CTHREAD_H_
#include "plat.h"

class CThread
{
public:
    enum
    {
        enmThreadTerminateTimeout = 2000,
    };
    CThread();
    virtual ~CThread();
    int32_t            Start();
    virtual int32_t    Terminate();
    virtual void    Execute();
protected:
#ifdef OS_WIN32
    uint32_t        m_nTimeOut;
    HANDLE            m_hThread;
#else
    pthread_t        m_thread;
    pthread_mutex_t m_stMutex;
#endif
    bool            m_bTerminated;
};

#endif

.cpp

#include "thread.h"
#include "common_api.h"
#ifdef   OS_WIN32
void ThreadProc(void *pParam)
{
    if (NULL == pParam)
    {
        return;
    }
    CThread *p = (CThread*)pParam;
    p->Execute();
}
#else
void* ThreadProc(void* pParam)
{
    if (NULL == pParam)
    {
        return NULL;
    }
    CThread *p = (CThread*)pParam;
    p->Execute();
    return NULL;
}
#endif

CThread::CThread()
{
#ifdef OS_WIN32
    m_nTimeOut = enmThreadTerminateTimeout;
    m_hThread = INVALID_HANDLE_VALUE;
#else
    m_thread = 0;
#endif
    m_bTerminated = false;
}

CThread::~CThread()
{
    Terminate();
}

int32_t CThread::Start()
{
    m_bTerminated = false;
#ifdef OS_WIN32
    m_hThread = (HANDLE)_beginthread(ThreadProc, 0, this);
#else
    pthread_create(&m_thread, NULL, ThreadProc, this);
#endif
    return 0;
}

int32_t CThread::Terminate()
{
    if (m_bTerminated == true)
    {
        return 0;
    }
    m_bTerminated = true;
#ifdef OS_WIN32
    if (m_hThread != INVALID_HANDLE_VALUE)
    {
        // wait for (m_nTimeOut) milliseconds or Excute() return
        WaitForSingleObject(m_hThread, m_nTimeOut);
    }
#else
    if (m_thread != 0)
    {
        // wait Excute() return
        pthread_join(m_thread, NULL);
    }
#endif
    return 0;
}

void CThread::Execute()
{
    uint32_t n = 0;
    while (!m_bTerminated)
    {
        if ((++n) % 1000 == 0)
        {
            printf("%d\n", n);
        }
        Delay(1);
    }
#ifdef WIN32
    _endthread();
#else
    pthread_exit(NULL);
#endif
}
时间: 2024-12-25 07:19:48

C++ 线程类的一个实现的相关文章

转:一个跨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 D

C#的线程类之Thread类以及对为什么设置线程优先级却不先执行这一问题本身的认识

1.C#对线程进行操作时,通过Thread类,可以对线程进行创建.挂起.恢复.休眠.终止及设置优先级. Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中.用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级 2.Thr

Delphi线程类 DIY(把类指针作为参数传进去,就可以执行类里面的方法啦)

Delphi 封装了一个很强大的线程类 TThread, 我们也自己动手制作一个简单的线程类 首先Type一个类 [delphi] view plain copy type TwwThread = class constructor Create; overload; destructor Destroy; override; private m_hThread: THandle;     //线程 m_ThreadID : TThreadID; public procedure Execute

一种线程类的实现方法

写一个线程基类,用户通过继承该基类,重写基类中定义的线程运行函数,即可实现启动线程运行自己的函数. 1 //Thread.h 2 3 #ifndef _THREAD_H 4 #define _THREAD_H 5 6 #include <pthread.h> 7 8 class Thread 9 { 10 public: 11 Thread(); 12 virtual ~Thread(); 13 void Start(); 14 void SetAutoDelete(bool autoDele

MFC--串口编程---WIN API的方式将串扣操作封装在线程类中

串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比如是COM20可能就打不开(这里我没有实践,师兄给这样说的),波特率太高读数会出错. 2).利用Windows API通信函数(该工程里面就采用的这种方式) 3).利用Visual C++的标准通信函数_inp._inpw._inpd._outp等直接对串口进行操作. 4).第三方编写的通信类. 二

第十三章 进程、线程类的实现

                                        第十三章   进程.线程类的实现         多线程是指在一个进程内可以同时运行多个任务,每个任务由一个单独的线程来完成.线程是进程运行的基本单位,一个进程中可以同时运行多个线程.如果程序被设置为多线程方式,可以提高程序运行的效率和处理速度. 多个线程共用一个进程的资源:进程的调度.切换是在10ms的"时钟滴答"定时中断程序里进行.如果一个线程获得CPU,那么在下一个Tick到来前:是不可能被切换出去的

QT线程(一):线程类

线程之间共享数据,但又单独执行: QT线程QThread是平台无关的: 通常主线程从main开始执行,而在主线程中创建其他线程,其他线程派生于QThread: 1.线程优先级 总共8个优先级:线程优先级从上到下越来越高. Constant Value Description QThread::IdlePriority 0 scheduled only when no other threads are running. QThread::LowestPriority 1 scheduled le

[Java聊天室服务器]实战之四 线程类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

mysql源码---核心类 (1)线程类

线程是mysql一个很重要的概念.线程用来处理来自客户端的连接,线程和连接是1:1的关.线程和THD对象也是1:1对应的关系,有些线程会被设置为优先,而有些线程没有优先级,而线程的优先级设置在sql/mysql_priv.h #define INTERRUPT_PRIOR -2 #define CONNECT_PRIOR -1 #define WAIT_PRIOR 0 #define QUERY_PRIOR 2 (THD是mysql线程描述符类) 线程初始化工作: void THD::init(