FDLib中的VC++的线程类

本文介绍了一种使用VC++实现的自定义线程类FDThread,通过封装底层线程API,简化了多线程应用程序的开发过程。文章详细展示了FDThread类的设计思路、实现代码及使用方法。
VC++的线程类
 
现在java和C#等编程语言都提供了线程类,大大方便了多线程程序的开发。而我1995年至2001年这段期间使用C++的时候,VC却没有提供很好的线程类,只能使用Win32的SDK的线程函数,开发多线程系统相当不容易。1999年的时候,随着自己开发经验的逐渐积累,以及对面向对象思想了解的加深,开发了FDLib系列C++的工具类,并进行了很好的归纳和分类,封装成dll和lib,并在此后的项目开发中不断的进行充实和完善。FDLib在很大程度上简化了C++的开发,使我的开发速度和开发质量都有了很大的提高。而我的技术水平也从那时候开始有了质的飞跃。
 
值得一提的是,当时在asia.com时的一个部下,从我这儿得到了FDLib的开发包。离开asia.com到其它公司之后,仍然把FDLib当作一个秘密武器在工作中使用,结果工作成绩非常突出,很快就得到提升,现在已经在一个公司当技术总监了。另外一个部下,跳槽到华友世纪(一个排名很靠前的SP公司)后,把我当年用VC开发的一个短信网关客户端也给带到了华友,时隔6,7年了,据说现在还运行在华友的服务器上。
 
闲话少说,现在给大家介绍一下FDLib中的线程类FDThread。过了这么多年,不知道对别人还有没有帮助。
 
1.       头文件

#if !defined(AFX_THREAD_H__528A75A7_BCED_11D3_9FC1_0080C735358E__INCLUDED_)
#define AFX_THREAD_H__528A75A7_BCED_11D3_9FC1_0080C735358E__INCLUDED_
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Thread.h : header file
//
 
/////////////////////////////////////////////////////////////////////////////
// CFDThread thread
 
class CFDThread
{
public:
     CFDThread();
     virtual ~CFDThread();
 
// Operations
public:
     int                Start();
     void               Stop();
     void               SetPriority(int nPriority){SetThreadPriority(m_hThread,nPriority);}
     void               Terminate();
 
protected:
     virtual int        ThreadProc(){return 0;}
     virtual void       StopProc(){}
     virtual void       InitProc(){}
     virtual void       ExitProc(){}
 
private:
     friend int         MainThreadProc(CFDThread *pFDThread);
     HANDLE             m_hThread;
     UINT               m_nThreadID;
     bool               m_bIsRunning;
public:
     bool               IsRunning() {return m_bIsRunning;}
};
 
/////////////////////////////////////////////////////////////////////////////
 
#endif // !defined(AFX_THREAD_H__528A75A7_BCED_11D3_9FC1_0080C735358E__INCLUDED_)
 
 
2.       CPP文件

// Thread.cpp : implementation file
//
 
#include "stdafx.h"
#include "FDThread.h"
#include "FDCoreFunction.h"
 
/////////////////////////////////////////////////////////////////////////////
// CFDThread
 
CFDThread::CFDThread()
{
     m_hThread=NULL;
     m_nThreadID=0;
     m_bIsRunning=false;
}
 
CFDThread::~CFDThread()
{
     Terminate();
}
 
int CFDThread::Start()
{
     if(m_hThread!=NULL)
     {
         return -1;
     }
 
     DWORD dwFlag=0;
 
     m_hThread=(void*)_beginthreadex(NULL,0,(unsigned(__stdcall*)(void*))MainThreadProc,this,dwFlag,&m_nThreadID);
 
     if(m_hThread==NULL)
     {
         return errno;
     }
 
     return 0;
}
 
void CFDThread::Stop()
{
     StopProc();
 
     while(m_bIsRunning==true)
     {
         FDSleep(100);
     }
}
 
void CFDThread::Terminate()
{
     if(m_hThread!=NULL)
     {
         if(TerminateThread(m_hThread,-1)==FALSE)
              return;
         m_hThread=NULL;
         m_nThreadID=0;
     }
}
 
int MainThreadProc(CFDThread *pFDThread)
{
     pFDThread->InitProc();
 
     pFDThread->m_bIsRunning=true;
     int nExitCode=pFDThread->ThreadProc();
     pFDThread->m_bIsRunning=false;
 
     CloseHandle(pFDThread->m_hThread);
     pFDThread->m_hThread=NULL;
     pFDThread->m_nThreadID=0;
    
     pFDThread->ExitProc();
 
     return nExitCode;
}
 
3.       使用方法介绍
1)        从CFDThread派生一个class,该class是实际的线程类
2)        重载ThreadProc和StopProc
其中ThreadProc是线程体,一般写法如下:

int      ThreadProc()
{
     while(m_bCanExit==FALSE)
     {
          //……
          Sleep(10);
     }
     return 0;
}
StopProc设置线程自然终止的条件,一般写法如下:

void     StopProc()
{
     m_bCanExit=TRUE;
}
3)        InitProc可以重载,在线程刚启动时被调用
4)        ExitProc可以重载,在线程自然退出前被调用
5)        成员介绍

方法
描述
Start
开始线程
Stop
自然终止线程,直到线程终止才退出
SetPriority
设置线程优先级
Terminate
强制终止线程
 

 
描述
Start
开始线程
Stop
自然终止线程,直到线程终止才退出
SetPriority
设置线程优先级
Terminate
强制终止线程
 
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值