FDLib中的VC++的线程类

来源:互联网 发布:吉利电动车知豆d1图片 编辑:程序博客网 时间:2024/05/22 17:38
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
强制终止线程

 
 
原创粉丝点击