动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

线程函数的介绍

08-04 11:31 1005浏览
举报 T字号
  • 大字
  • 中字
  • 小字

CBaseThread类

BaseThread.h

// BaseThread.h: interface for the CBaseThread class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_)  //#if !defined  防止重复定义
#define AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_
#if _MSC_VER > 1000
#pragma once  //只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次
#endif // _MSC_VER > 1000
#include "BaseCallBack.h"
class CBaseThread
{
public:
    CBaseThread();
    virtual ~CBaseThread();  // 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。
    DWORD Start(DWORD dwCreationFlags = 0);
    virtual DWORD Stop(WORD timeout, BOOL bForceKill = FALSE);
    DWORD Suspend();
    DWORD Resume();
    BOOL SetPriority(int nPriority);
    int GetPriority();
    void SetICallBack(CBaseCallBack* pCallBack)  //函数指针 指向函数的首地址
    {
        this->m_pCallBack = pCallBack;  //改变指向类的指针的指向
    }
    BOOL GetThreadRunState() const {return m_bRunThread;}
    DWORD GetStartTime(){return m_dwStartTime;}
    void ResetStartTime(){m_dwStartTime = GetTickCount();}
    void SetStatisticalTime(DWORD dwTimeLen){m_dwStatisticalTime = dwTimeLen;}
    DWORD GetStatisticalTime(){return m_dwStatisticalTime;}
protected:
    virtual DWORD ThreadMethod() = 0;  //纯虚函数
private:
    static DWORD WINAPI ThreadFunc( LPVOID pParam);
public:
    HANDLE m_hThread;      //线程句柄
    DWORD m_dwTID;        //线程ID
    DWORD m_dwExitCode;   //线程退出码
    DWORD m_dwStartTime;
    DWORD m_dwStatisticalTime;
protected:
    LPTHREAD_START_ROUTINE m_pThreadFunction;    //工作线程指针
    BOOL m_bRunThread;         //线程是否继续运行的标志
    CBaseCallBack *m_pCallBack;          //指向类的指针
};
#endif // !defined(AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_)

BaseThread.cpp

// ADThread.cpp: implementation of the CBaseThread class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BaseThread.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBaseThread::CBaseThread()
{
    m_pThreadFunction = CBaseThread::ThreadFunc;
    m_bRunThread = FALSE;
    m_hThread = NULL;
}
CBaseThread::~CBaseThread()
{
    if (m_hThread != NULL)
    {
        Stop(1000, true);
    }
}
DWORD CBaseThread::Start(DWORD dwCreationFlags)         //线程开始
{
    m_bRunThread = true;
    m_hThread = CreateThread(NULL, 0, m_pThreadFunction, this, dwCreationFlags, &m_dwTID);  //创建线程
    m_dwExitCode = (DWORD)-1;
    ResetStartTime();
    return GetLastError();
}
/************************************************************************/
/* 功能:停止线程
/* 参数:bForceKill,若TRUE,强制立即结束,否则,温柔结束
         timeout:为等待时间,一毫秒记
/************************************************************************/
DWORD CBaseThread::Stop(WORD timeout, BOOL bForceKill)    //线程停止
{
    if (m_hThread != NULL)
    {
        //尝试"温柔地"结束线程
        if (m_bRunThread)
        {
            m_bRunThread = FALSE;
            WaitForSingleObject(m_hThread, timeout); //WaitForSingleObject()在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
        }
        GetExitCodeThread(m_hThread, &m_dwExitCode);  //获取一个已中止线程的退出代码
        if (m_dwExitCode == STILL_ACTIVE && bForceKill)
        {
            //强制杀死线程
            TerminateThread(m_hThread, DWORD(-1));  //在线程外终止一个线程,用于强制终止线程 DWORD dwExitCode 退出码
            m_hThread = NULL;
        }
    }
    return m_dwExitCode;
}
/************************************************************************/
/*功能:挂起线程
/************************************************************************/
DWORD CBaseThread::Suspend()
{
    return SuspendThread(m_hThread);
}
/************************************************************************/
/*功能:恢复线程
/************************************************************************/
DWORD CBaseThread::Resume()
{
    return ResumeThread(m_hThread);
}
/************************************************************************/
/*功能:设置线程优先级
/*参数:priority:查看SetThreadPriority() in windows sdk,其可能取值。
/************************************************************************/
BOOL CBaseThread::SetPriority(int nPriority)
{
    return SetThreadPriority(m_hThread, nPriority);
}
/************************************************************************/
/* 功能:获得线程优先级
/************************************************************************/
int CBaseThread::GetPriority()
{
    return GetThreadPriority(m_hThread);
}
/************************************************************************/
/* 功能:静态线程函数, 调用实际的工作函数ThreadMethod()
/* 参数:pParam:在需要启用该线程函数的子类实例中,将this传给线程函数,以便线程函数可以访问该实例的成员。
/************************************************************************/
DWORD WINAPI CBaseThread::ThreadFunc(LPVOID pParam)
{
    CBaseThread *pParent = reinterpret_cast<CBaseThread*>(pParam); //reinterpret_cast<type-id> (expression)强制类型转换符
                                                                    //type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针
    pParent->ThreadMethod();    //多态性,调用子类的实际工作函数
    return 0;
}

BaseCallBack.h

// BaseCallBack.h: interface for the CBaseCallBack class.
//
//////////////////////////////////////////////////////////////////////
#ifndef _BASECALLBACK_H_
#define _BASECALLBACK_H_
typedef short I16;
class CBaseCallBack
{
public:
    virtual ~CBaseCallBack(){}
    virtual void CallBackMethod(short *psiBuf, DWORD dwSize) = 0;
    virtual void CallBackMethod() = 0;
    virtual void CallBackMethod(WPARAM wPara){;}
};
#endif

动力节点在线课程涵盖零基础入门,高级进阶,在职提升三大主力内容,覆盖Java从入门到就业提升的全体系学习内容。全部Java视频教程免费观看,相关学习资料免费下载!对于火爆技术,每周一定时更新!如果想了解更多相关技术,可以到动力节点在线免费观看Java多线程视频教程哦!

0人推荐
共同学习,写下你的评论
0条评论
代码小兵988
程序员代码小兵988

67篇文章贡献228982字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java初学者学习方法

代码小兵64503-29 11:46

两道经典算法问题

代码小兵51603-29 13:18

Java中模拟高并发的方法

代码小兵87208-06 11:36

高并发编程基础知识

代码小兵27908-06 11:30

JsonPath使用方法

代码小兵34507-29 13:19

发评论

举报

0/150

取消