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
|
强制终止线程
|