一个封装好的线程类

转自一个网友的贴,线程封装
一.创建线程函数
     常用的创建线程的函数是CreateThread,还有MFC中的AfxBeginThread方法.另一种函数是_beginthreadex,
其实它在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更
安全.所以一般使用_beginthreadex来创建线程.于是以下使用_beginthreadex函数来创建线程类.

二.线程类示例
1.Thread.h文件如下:
#ifndef _THREAD_H__
#define  _THREAD_H__
#include  < process.h >
#include  < windows.h >

class  CThread
{
public:
public:
    CThread();
    virtual ~CThread();
    
    BOOL StartThread();   //开始线程
    BOOL SuspendThread(); //挂起线程
    virtual BOOL Run();   //线程的入口
    BOOL StopThread();    //等待线程退出再返回
    
    static unsigned __stdcall start_address( void * obj);

public:
    HANDLE m_hthread;        //线程句柄
    HANDLE m_hEventSuspend;  //用于标识线程是工作,还是挂起状态
    BOOL m_status;           //线程状态,FALSE表示线程退出状态,TRUE表示未提出状态
    unsigned  m_thrdaddr;
}
;

#endif /*_THREAD_H__*/


2.Thread.cpp文件如下:
#include  " Thread.h "


CThread::CThread()
{
    m_hEventSuspend = CreateEvent(0,TRUE,FALSE,NULL);//创建事件句柄,且为非激发状态
    m_status = TRUE;

    //创建线程
    m_hthread = (HANDLE)_beginthreadex(NULL,0,CThread::start_address,this,0,&m_thrdaddr);
}


CThread:: ~ CThread()
{
    CloseHandle(m_hEventSuspend);
    CloseHandle( m_hthread );
}


BOOL CThread::StartThread()
{
    return SetEvent(m_hEventSuspend);
}


BOOL CThread::SuspendThread()
{
    return ResetEvent(m_hEventSuspend);
}


BOOL CThread::Run()
{
    return TRUE;
}


BOOL CThread::StopThread()
{
    m_status = FALSE;//将线程状态置为退出
    StartThread();   //把线程唤醒,以免挂死在休眠处
    WaitForSingleObject(m_hthread,INFINITE); //等待线程退出

    return TRUE;
}


unsigned __stdcall CThread::start_address(  void   *  obj)
{
    CThread* pthread = static_cast<CThread*>(obj);

    while(pthread->m_status)
    {
        WaitForSingleObject(pthread->m_hEventSuspend,INFINITE);//控制挂起,运行
        //如果自动退出
        if (!pthread->Run())
            break;
    }

    _endthreadex(0);

    return 0;
}



三.线程类的使用
1. 新建一个win32控制台工程,代码如下:
#include  " Thread.h "
#include  < iostream >
#include  < conio.h >


using   namespace  std;


class  CMyThread: public  CThread
{
public:
    BOOL Run()
    {
        cout<<"hello!"<<endl;
        Sleep(5000);
        return TRUE;
    }

}
;

int  main( int  argc, char   * argv[])
{
    //创建线程
    CMyThread mythread;

    //让线程启动
    mythread.StartThread();
    
    //按任意键,线程挂起
    _getch();
    mythread.SuspendThread();
    cout<<"thread suspend"<<endl;

    //接任意键,线程停止
    _getch();
    mythread.StopThread();
    cout<<"thread stop"<<endl;

    //按任意键,程序退出
    _getch();

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值