初步打算使用模版实现,但本人比较懒所以只实现了一个Evnet#ifndef JADE_THREAD_H
#define JADE_THREAD_H
#include <windows.h>
#include "Jade_config_Thread_pool.h"
#include "Jade_MsgChain.h"
typedef unsigned (__stdcall *PTHREAD_START) (void *);
#define chBEGINTHREADEX(psa, cbStack, pfnStartAddr, \
pvParam, fdwCreate, pdwThreadId) \
((HANDLE)_beginthreadex( \
(void *) (psa), \
(unsigned) (cbStack), \
(PTHREAD_START) (pfnStartAddr), \
(void *) (pvParam), \
(unsigned) (fdwCreate), \
(unsigned *) (pdwThreadId)))
/*----------------------------------------------------------------------------------
功能描述:一个线程的抽象表现,实现:运行、停止、重起、建立,销毁、
任务的执行完成状态,
-----------------------------------------------------------------------------------*/
class Jade_ThreadByEvent
{
public:
Jade_ThreadByEvent();
/*使用消息链表*/
//Jade_ThreadByEvent(Jade_MsgChain *const lpMsgChain);
~Jade_ThreadByEvent();
public:
enum ThreadStatus{TLS_RUN = 0x00000001,TLS_STOP,TLS_KILL,TLS_COMPLETE,TLS_PENDING};
DWORD Create(DWORD dwStackSize,DWORD dwReturn = 0,DWORD dwLevel = 0,Jade_TaskBase *pTask = NULL);
void SetTimeOut(DWORD dwTime = INFINITE); //是否需要?
long GetTaskRunTime(long &dwTime) const; //取得线程运行时间
DWORD Run(Jade_TaskBase *pTask = NULL);
DWORD Suspend();
DWORD Stop();
DWORD Rerun();
DWORD Restart();
DWORD Kill();
DWORD CheckState(DWORD dwState);
DWORD ResetTask(Jade_TaskBase *pTask);
DWORD SetPriority(DWORD dwLevel);
DWORD DelTask();
DWORD IsEmpty();
DWORD GetMsg(TMSG &pMsg,UINT unBinMsg,UINT unEndMsg,UINT unMax);
private:
static DWORD CALLBACK ThreadProc(LPVOID lpParam);
static DWORD FilterCode(DWORD dwErrCode,LPVOID lpVoid);
DWORD Abend(DWORD dwCode = 0);
protected:
DWORD CheckRep(UINT unMsg,list<TMSG*> &lsObj,DWORD &dwCount,TMSG *pSwap = NULL);
private:
HANDLE m_hThread; //线程的实现描述
HANDLE m_hEvent[3]; //2-运行、1-停止、0-结束(线程状态)
HANDLE m_hWaitEvent[3]; //0-停止、1-结束(等待返回确认状态),2-任务执行时间,3-任务已完成
Jade_TaskBase *m_pTask; //所要执行的任务
DWORD m_dwReturn; //该线程的返回值
DWORD m_dwID; //线程ID
DWORD m_dwState; //线程状态:如运行,停止,销毁等状态
DWORD m_dwTimeOut; //线程执行超时
DWORD m_dwResult; //任务执行结果
long m_lTaskTime; //任务执行时间
list<TMSG*> m_lstMsg; //用于存储当前线程发生的事件消息
};
#if defined(__JADE_THREADPOOL_INLINE__)
#include "Jade_ThreadByEvent.inl"
#endif /*__JADE_THREAD_INLINE__*/
typedef list<Jade_ThreadByEvent*> List_ThreadByEvent;
typedef list<Jade_ThreadByEvent*>::iterator LPList_ThreadByEvent;
#endif
#define JADE_THREAD_H
#include <windows.h>
#include "Jade_config_Thread_pool.h"
#include "Jade_MsgChain.h"
typedef unsigned (__stdcall *PTHREAD_START) (void *);
#define chBEGINTHREADEX(psa, cbStack, pfnStartAddr, \
pvParam, fdwCreate, pdwThreadId) \
((HANDLE)_beginthreadex( \
(void *) (psa), \
(unsigned) (cbStack), \
(PTHREAD_START) (pfnStartAddr), \
(void *) (pvParam), \
(unsigned) (fdwCreate), \
(unsigned *) (pdwThreadId)))
/*----------------------------------------------------------------------------------
功能描述:一个线程的抽象表现,实现:运行、停止、重起、建立,销毁、
任务的执行完成状态,
-----------------------------------------------------------------------------------*/
class Jade_ThreadByEvent
{
public:
Jade_ThreadByEvent();
/*使用消息链表*/
//Jade_ThreadByEvent(Jade_MsgChain *const lpMsgChain);
~Jade_ThreadByEvent();
public:
enum ThreadStatus{TLS_RUN = 0x00000001,TLS_STOP,TLS_KILL,TLS_COMPLETE,TLS_PENDING};
DWORD Create(DWORD dwStackSize,DWORD dwReturn = 0,DWORD dwLevel = 0,Jade_TaskBase *pTask = NULL);
void SetTimeOut(DWORD dwTime = INFINITE); //是否需要?
long GetTaskRunTime(long &dwTime) const; //取得线程运行时间
DWORD Run(Jade_TaskBase *pTask = NULL);
DWORD Suspend();
DWORD Stop();
DWORD Rerun();
DWORD Restart();
DWORD Kill();
DWORD CheckState(DWORD dwState);
DWORD ResetTask(Jade_TaskBase *pTask);
DWORD SetPriority(DWORD dwLevel);
DWORD DelTask();
DWORD IsEmpty();
DWORD GetMsg(TMSG &pMsg,UINT unBinMsg,UINT unEndMsg,UINT unMax);
private:
static DWORD CALLBACK ThreadProc(LPVOID lpParam);
static DWORD FilterCode(DWORD dwErrCode,LPVOID lpVoid);
DWORD Abend(DWORD dwCode = 0);
protected:
DWORD CheckRep(UINT unMsg,list<TMSG*> &lsObj,DWORD &dwCount,TMSG *pSwap = NULL);
private:
HANDLE m_hThread; //线程的实现描述
HANDLE m_hEvent[3]; //2-运行、1-停止、0-结束(线程状态)
HANDLE m_hWaitEvent[3]; //0-停止、1-结束(等待返回确认状态),2-任务执行时间,3-任务已完成
Jade_TaskBase *m_pTask; //所要执行的任务
DWORD m_dwReturn; //该线程的返回值
DWORD m_dwID; //线程ID
DWORD m_dwState; //线程状态:如运行,停止,销毁等状态
DWORD m_dwTimeOut; //线程执行超时
DWORD m_dwResult; //任务执行结果
long m_lTaskTime; //任务执行时间
list<TMSG*> m_lstMsg; //用于存储当前线程发生的事件消息
};
#if defined(__JADE_THREADPOOL_INLINE__)
#include "Jade_ThreadByEvent.inl"
#endif /*__JADE_THREAD_INLINE__*/
typedef list<Jade_ThreadByEvent*> List_ThreadByEvent;
typedef list<Jade_ThreadByEvent*>::iterator LPList_ThreadByEvent;
#endif
说明:该文件用来进行编译选项以及一些错误信息,必要的基类,线程池使用的形参
类型等信息的定义均在该头
-------------------------------------------------------------------------------------*/
#ifndef _JADE_CONFIG_THREAD_POOL__
#define _JADE_CONFIG_THREAD_POOL__#include <list>
#include <vector>
#include <map>
#include <utility>
using namespace std;#if defined(__JADE_THREADPOOL_NO_INLINE__)
#undef __JADE_THREADPOOL_INLINE__
#endif#if defined(__JADE_THREADPOOL_INLINE__)
#define JADE_THREADPOOL_INLINE inline
#else
#define JADE_THREADPOOL_INLINE
#endif#define JADE_OK 0x00000000 //操作成功
#define JADE_THREAD_ERROR_FULL 0x00000001 //线程池满
#define JADE_THREAD_ERROR_STOP 0x00000002 //该线程以停止
#define JADE_THREAD_ERROR_USED 0x00000003 //指定的线程被占用
#define JADE_LOCAL_MODEL 0x00000010 //
#define JADE_THREAD_CREATED 0x00000004 //线程已创建
#define JADE_THREAD_FAIL 0x00000005 //失败
#define JADE_THREAD_FALSE 0x00000006 //异常错误
#define JADE_THREAD_KILLED 0x00000007 //已删除
#define JADE_ALLOC_LOCAL 0x00000008 //TLS内存处理方式
#define JADE_ALLOC_GLOBAL 0x00000009 //全局内存分配方式
#define JADE_FALSE 0x0000000A //操作错误
#define JADE_TASK_FULL 0x0000000B //任务满
#define JADE_TASK_RUN 0x0000000C //任务正在执行
#define JADE_TASK_WAIT 0x0000000D //等待处理
#define JADE_LESSMEM 0x0000000E //内存不足
//begin(线程间通讯消息)
#define JADE_MANAGE_FILO#define THDM_DESTROY 0x00000000 //线程消亡-LOW 线程的结束代码
// -HIGH 0 保留
#define THDM_CREATE 0x00000001 //线程建立-LOW 线程类型(以后可能添加资源线程以及窗口类型线程)
// -HIGH 该类型线程的初始化信息(目前为CONTEXT)
#define THDM_INITIALIZE 0x00000002 //线程初始化 保留#define THDM_TASKCMP 0x00000003 //线程任务执行完毕 - LOW 任务所占用的时间片
// - HIGH 执行该任务的线程HANDLE
#define THDM_STOP 0x00000004 //处于等待状态 - LOW 线程的停止时间
// - HIGH 停止类型(指定在抵达时间后是否自动恢复其运行)
#define THDM_SUSPEND 0x00000005 //线程处于悬挂状态 - LOW 线程悬挂时间
// - HIGH 0 保留
#define THDM_RUNTASK 0x00000006 //处理事务 - LOW 0 保留
// HIGH 0 保留
#define THDM_COPYDATA 0x00000007 //发送自定义数据 - LOW 0 保留
// - 指向_tagCOPYDATA结构体的指针
#define JM_NOREMOVE 0x00000000 //删除该消息
#define JM_REMOVE 0x00000001 //保留该消息typedef struct _tagTMSG
{
HANDLE hThread; //该消息的拥有者
UINT dwMsg; //估计用4个数据位16进制表示应该足以
DWORD dwLow; //因消息类型而定
DWORD dwHigh; //因消息类型而定
long ltime; //该消息生成时间
}TMSG,*PTMSG; //消息结构体typedef struct _tagCOPYDATA
{
DWORD dwSize; //lpData地址内的长度
PVOID lpData; //起始地址
}COPYDATA,*LPCOPYDATA;
//end(线程间通讯消息)
#define JADE_SUCCEEDED(dwStatus) ((DWORD)(dwStatus)==0)/*----------------------------------------------------------------------------------
功能说明: 任务处理基类使用者,请从该类进行子类化的派生。
每个抽象类必须实现TaskProc方法以便Jade_Thread
Pool调用您所需要的处理过程。
方法说明:
TaskProc 处理过程
OtherProc 保留处理过程
参数:
LPVOID pParam 目前为该任务类的this指针
DWORD dwID 该任务类所占用的线程ID
-----------------------------------------------------------------------------------*/
class Jade_TaskBase
{
public :
Jade_TaskBase(void)
{};
virtual ~Jade_TaskBase(void)
{};
public:
virtual DWORD TaskProc(LPVOID pParam,DWORD dwID) = 0;
virtual DWORD DestroyProc(DWORD dwEixt) = 0;
virtual DWORD OtherProc(LPVOID pParam,DWORD dwOther) = 0;
};typedef list<Jade_TaskBase*> List_Task;
typedef vector<Jade_TaskBase*> Vector_Task;
#endif
/*------------------------------------------------------------------------------------
方法功能:检测线程运行状态
参数:
Input:
DWORD dwState 检测状态
返回值:
DWORD 线程当前的运行状态 失败
JADE_OK 成功
-------------------------------------------------------------------------------------*/
JADE_THREADPOOL_INLINE
DWORD Jade_ThreadByEvent::CheckState(DWORD dwState)
{
if(dwState == m_dwState)
return JADE_OK;
return m_dwState;
}
/*------------------------------------------------------------------------------------
方法功能:设置线程运行优先级
参数:
Input:
DWORD dwLevel MSDN规定的优先级
返回值:
DWORD 线程当前的运行状态 失败
JADE_OK 成功
-------------------------------------------------------------------------------------*/
JADE_THREADPOOL_INLINE
DWORD Jade_ThreadByEvent::SetPriority(DWORD dwLevel)
{
if(m_hThread != NULL)
{
if(!SetThreadPriority(m_hThread,dwLevel))
return JADE_OK;
else
return GetLastError();
}
return JADE_FALSE;
}
/*------------------------------------------------------------------------------------
方法功能:删除任务
参数:
返回值:
DWORD 线程当前的运行状态 失败
JADE_OK 成功
-------------------------------------------------------------------------------------*/
JADE_THREADPOOL_INLINE
DWORD Jade_ThreadByEvent::DelTask()
{
if(m_pTask != NULL)
{
if(!JADE_SUCCEEDED(Stop()))
return JADE_FALSE;
m_pTask = NULL;
return JADE_OK;
}
JADE_FALSE;
}JADE_THREADPOOL_INLINE
DWORD Jade_ThreadByEvent::IsEmpty()
{
if(m_pTask != NULL)
return JADE_FALSE;
else
return JADE_OK;
}
JADE_THREADPOOL_INLINE
long Jade_ThreadByEvent::GetTaskRunTime(long &dwTime) const
{
DWORD dwObject = WaitForSingleObject(m_hWaitEvent[2],1000);
switch(dwObject)
{
case WAIT_TIMEOUT:
return JADE_FALSE;
case WAIT_OBJECT_0 + 0:
dwTime = m_lTaskTime;
return m_lTaskTime;
}
}
JADE_THREADPOOL_INLINE
DWORD Jade_ThreadByEvent::Stop()
{
ResetEvent(m_hEvent[2]);
return JADE_OK;
}
JADE_THREADPOOL_INLINE
DWORD Jade_ThreadByEvent::Rerun()
{
SetEvent(m_hEvent[2]);
return JADE_OK;
}
#include "stdafx.h"
#include <time.h>
#include <process.h>
#include "Jade_MsgChain.h"
#include "Jade_ThreadByEvent.h"#if !defined(__JADE_THREADPOOL_INLINE__)
#include "Jade_ThreadByEvent.inl"
#endif /*__JADE_THREAD_INLINE__*/Jade_ThreadByEvent::Jade_ThreadByEvent():m_hThread(NULL),m_pTask(NULL),m_dwReturn(0),m_dwID(0)
,m_dwState(0),m_dwTimeOut(INFINITE),m_lTaskTime(0)
{
m_hEvent[0] = CreateEvent(NULL,TRUE,FALSE,NULL);
m_hEvent[1] = CreateEvent(NULL,TRUE,FALSE,NULL);
m_hEvent[2] = CreateEvent(NULL,TRUE,FALSE,NULL);
m_hWaitEvent[0] = CreateEvent(NULL,TRUE,FALSE,NULL);
m_hWaitEvent[1] = CreateEvent(NULL,TRUE,FALSE,NULL);
m_hWaitEvent[2] = CreateEvent(NULL,TRUE,FALSE,NULL);
}Jade_ThreadByEvent::~Jade_ThreadByEvent()
{
//Kill Thread
Kill();
//Kill Event
for(int i=0;i<3;i++)
{
if(m_hEvent[i]!=NULL)
{
CloseHandle(m_hEvent[i]);
m_hEvent[i] = NULL;
}
}
CloseHandle(m_hWaitEvent[0]);
CloseHandle(m_hWaitEvent[1]);
CloseHandle(m_hWaitEvent[2]);
ZeroMemory(m_hWaitEvent,sizeof(HANDLE)*2);
}
DWORD Jade_ThreadByEvent::Suspend()
{
if(JADE_SUCCEEDED(CheckState(TLS_STOP)))
{
return JADE_OK;
}
SetEvent(m_hEvent[1]);
return JADE_OK;
}
/*---------------------------------------------------------------------------------
方法说明:杀死线程---------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::Kill()
{
DWORD dwKill = 0,dwExitTime = 200;
if(m_hThread != NULL)
{
//检查线程状态
if(JADE_SUCCEEDED(CheckState(TLS_STOP)))
{
Restart();
}
SetEvent(m_hEvent[0]);
dwKill = WaitForSingleObject(m_hWaitEvent[1],INFINITE);
do
{
if(!GetExitCodeThread(m_hThread,&dwKill)||dwExitTime==1000)
{
Abend(); //异常非法结束
return GetLastError();
}
Sleep(dwExitTime);
dwExitTime++;
}while(dwKill != m_dwReturn);
CloseHandle(m_hThread);
m_hThread = NULL;
return JADE_OK;
}
return JADE_THREAD_KILLED;
}
/*---------------------------------------------------------------------------------------------
方法功能:建立线程,设定执行任务
参数:
Input:
DWORD dwStackSize 堆
DWORD dwReturn 返回值
LPVOID lpParam 任务的参数
JADE_TASKBASE* 任务
返回值:
DWORD 执行结果
----------------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::Create(DWORD dwStackSize,DWORD dwReturn,DWORD dwLevel,Jade_TaskBase *pTask)
{
if(m_hThread != NULL||m_dwID != 0)
return JADE_THREAD_CREATED;
__try
{
if(pTask != NULL)
{
m_hThread = chBEGINTHREADEX(NULL,dwStackSize,ThreadProc,this,0,&m_dwID);
if(m_hThread != NULL)
{
m_pTask = pTask;
m_dwState = TLS_RUN;
}
else
{
return GetLastError();
}
}
else
{
m_hThread = chBEGINTHREADEX(NULL,dwStackSize,ThreadProc,this,CREATE_SUSPENDED,&m_dwID);
if(m_hThread != NULL)
{
m_dwState = TLS_STOP;
}
else
{
return GetLastError();
}
}
if(dwLevel != 0 && m_hThread!=NULL)
{
if(!SetThreadPriority(m_hThread,dwLevel))
{
OutputDebugString("The Priority Failed/r/n");
}
}
m_dwReturn = dwReturn;
}
__except(FilterCode(GetExceptionCode(),this))
{
printf("线程创建错误\r\n");
return JADE_THREAD_FAIL;
}
return JADE_OK;
}
/*----------------------------------------------------------------------------------
方法说名:开始运行
参数:
input:
Jade_TaskBase *pTask 执行的任务
返回值:
DWORD 执行结果
------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::Run(Jade_TaskBase *pTask)
{
if(pTask != NULL)
m_pTask = pTask;
switch(m_dwState)
{
case TLS_RUN:
SetEvent(m_hEvent[2]);
break;
case TLS_STOP:
Restart();
SetEvent(m_hEvent[2]);
break;
}
return JADE_OK;
}
/*-------------------------------------------------------------------------------------
方法说明:重新启动线程 注:将停止状态的线程置运行状态
--------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::Restart()
{
DWORD dwReturn = 0,dw = 0;
if(JADE_SUCCEEDED(CheckState(TLS_STOP)))
dwReturn = ResumeThread(m_hThread);
if(dwReturn == -1)
return GetLastError();
for(;dwReturn > 0;)
{
dwReturn = ResumeThread(m_hThread);
}
ResetEvent(m_hEvent[1]);
return JADE_OK;
}
/*---------------------------------------------------------------------------------------
方法说明:重新设置线程的任务
参数:
input:
Jade_TaskBase *pTask 任务体
返回值:
DWORD 执行结果
----------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::ResetTask(Jade_TaskBase *pTask)
{
__try
{
if(pTask != NULL)
{
Stop();
m_pTask = pTask;
Restart();
}
}
__except(FilterCode(GetExceptionCode(),this))
{
char chCode[64] = { 0 };
DWORD dwResult = GetLastError();
sprintf(chCode,"Except Code is %d",dwResult);
OutputDebugString(chCode);
return JADE_THREAD_FALSE;
}
return JADE_OK;
}void Jade_ThreadByEvent::SetTimeOut(DWORD dwTime)
{
if(JADE_SUCCEEDED(CheckState(TLS_STOP)))
{
m_dwTimeOut = dwTime;
}
else
{
Stop();
m_dwTimeOut = dwTime;
Restart();
}
}
/*---------------------------------------------------------------------------------------
方法功能说明: 检查容器中重复消息的个数以及是否使用sSwap替换重复的消息
参数:
Input:
lsObj 受检查的容器
unMsg 重复的消息
Output:
dwCount 重复的元素个数
pSwap 非NULL则认为将使用该值替换重复元素
返回值:
JADE_FALSE 操作异常
JADE_OK 操作正常
----------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::CheckRep(UINT unMsg,list<TMSG*> &lsObj,DWORD &dwCount,TMSG *pSwap)
{
list<TMSG*>::iterator itBin = lsObj.begin();
DWORD dwSum = 0;
__try
{
for(;itBin!=lsObj.end();itBin++)
{
if( (*itBin)->dwMsg == unMsg)
{
if(pSwap != NULL)
{
(*itBin)->dwLow = pSwap->dwLow;
(*itBin)->dwHigh = (DWORD)pSwap->hThread;
(*itBin)->ltime = clock();
(*itBin)->dwMsg = pSwap->dwMsg;
}
dwSum++;
}
}
}
__except(FilterCode(GetExceptionCode(),this))
{
return JADE_FALSE;
}
dwCount = dwSum;
return JADE_OK;
}
[code]
/*--------------------------------------------------------------------------------------
方法说明: 线程实现体
参数:
input:
LPVOID lpParam Jade_Thread指针
返回值:
DWORD 执行结果
注:WaitForMultipleObjects有检查顺序所以运行状态要靠后,结束等待状态设置比较靠前
---------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::ThreadProc(LPVOID lpParam)
{
Jade_ThreadByEvent *pThis = static_cast<Jade_ThreadByEvent*>(lpParam);
DWORD dwReturn = pThis->m_dwReturn;
HANDLE hEvent[3] = { 0 };
char chBuf[128] = { 0 };
memcpy(hEvent,pThis->m_hEvent,sizeof(hEvent));
DWORD dwState = 0,dwCount = 0;
int nOther = 0;
clock_t tStart =0,tFinish = 0;
__try
{
LOOP:
dwState = WaitForMultipleObjects(3,hEvent,FALSE,pThis->m_dwTimeOut);
switch(dwState)
{
case WAIT_OBJECT_0 + 2:
//Run
{
pThis->m_dwState = TLS_RUN;
if(pThis->m_pTask != NULL)
{
tStart = clock();
pThis->m_pTask->TaskProc(pThis->m_pTask,pThis->m_dwID);
tFinish = clock();
pThis->m_lTaskTime = tFinish - tStart;
TMSG *tMsg = new TMSG;
tMsg->dwMsg = THDM_TASKCMP;
tMsg->dwLow = tFinish;
tMsg->dwHigh = (DWORD)pThis->m_hThread;
tMsg->ltime = clock();
//保证该类型消息在消息队列中只有一个
pThis->CheckRep(THDM_TASKCMP,pThis->m_lstMsg,dwCount,tMsg);
if(dwCount == 0)
pThis->m_lstMsg.push_back(tMsg);
else
{
delete tMsg;
// sprintf(chBuf,"%d\r\n",dwCount);
// MessageBox(NULL,chBuf,"Tip",MB_OK|MB_ICONSTOP);
// ZeroMemory(chBuf,sizeof(chBuf));
}
SetEvent(pThis->m_hWaitEvent[2]);
}
}
break;
case WAIT_OBJECT_0 + 1:
//Stop
pThis->m_dwState = TLS_STOP;
SuspendThread(pThis->m_hThread);
//由于是线程内停止所以因该只能被执行一次
break;
case WAIT_OBJECT_0 + 0:
//Kill
pThis->m_dwState = TLS_KILL;
if(pThis->m_pTask != NULL)
pThis->m_pTask->DestroyProc(pThis->m_dwReturn);
return SetEvent(pThis->m_hWaitEvent[1])?pThis->m_dwReturn:JADE_THREAD_FAIL;
break;
case WAIT_FAILED:
return JADE_THREAD_FALSE;
break;
}
goto LOOP;
}
__except(Jade_ThreadByEvent::FilterCode(GetExceptionCode(),pThis))
{
return JADE_THREAD_FALSE;
}
}
/*----------------------------------------------------------------------------------
方法功能:异常结束
参数说名:
input:
DWORD dwCode 异常结束码
返回值:
DWORD异常结束代码
----------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::Abend(DWORD dwCode)
{
char chCode[64] = { 0 };
if(dwCode == 0)
dwCode = GetLastError();
sprintf(chCode,"Abend Code is %d.\r\n",dwCode);
OutputDebugString(chCode);
TerminateThread(m_hThread,dwCode);
CloseHandle(m_hThread);
m_hThread = NULL;
return dwCode;
}
/*---------------------------------------------------------------------------------------
方法功能: 获取unBinMsg,unEndMsg之间的可用消息
参数:
Input:
unBinMsg 最小值消息
unEndMsg 最大值消息
unMax 最大尝试次数
Output:
pMsg 在unBinMsg与unEndMsg之间的可用消息
返回值:
待定
----------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::GetMsg(TMSG &pMsg,UINT unBinMsg,UINT unEndMsg,UINT unMax)
{
//首先停止线程的运作
UINT unRun = 0;
//取表首消息
DWORD dwRlt = WaitForSingleObject(m_hWaitEvent[2],INFINITE);
if(dwRlt == WAIT_OBJECT_0)
{
list<TMSG*>::iterator pMsgBin = m_lstMsg.begin();
int s = m_lstMsg.size();
for(;pMsgBin!=m_lstMsg.end();pMsgBin++)
{
if( (*pMsgBin)->dwMsg<=unBinMsg && (*pMsgBin)->dwMsg>=unBinMsg)
{
if((*pMsgBin)->hThread != NULL)
{
pMsg.dwHigh = (*pMsgBin)->dwHigh;
pMsg.dwLow = (*pMsgBin)->dwLow;
pMsg.dwMsg = (*pMsgBin)->dwMsg;
pMsg.hThread = (*pMsgBin)->hThread;
pMsg.ltime = (*pMsgBin)->ltime;
m_lstMsg.erase(pMsgBin);
return JADE_OK;
}
}
}
}
//消息队列中不包含可用的类型消息
return JADE_FALSE;
}
/*----------------------------------------------------------------------------------------
方法功能: 异常过滤
参数:
Input:
dwErrCode 异常过滤码
lpVoid this指针
返回值:
待定
-----------------------------------------------------------------------------------------*/
DWORD Jade_ThreadByEvent::FilterCode(DWORD dwErrCode,LPVOID lpVoid)
{
Jade_ThreadByEvent *pThis = static_cast<Jade_ThreadByEvent*>(lpVoid);
char chCode[64] = { 0 };
switch(dwErrCode)
{
case EXCEPTION_ACCESS_VIOLATION:
sprintf(chCode,"线程%d访问内存地址违规.\r\n",pThis->m_dwReturn);
OutputDebugString(chCode);
//Other Except Proc
if(pThis->m_hThread != NULL)
pThis->Abend();
return dwErrCode;
case EXCEPTION_BREAKPOINT:
break;
case EXCEPTION_DATATYPE_MISALIGNMENT:
break;
case EXCEPTION_SINGLE_STEP:
break;
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
break;
case EXCEPTION_FLT_DENORMAL_OPERAND:
break;
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
break;
case EXCEPTION_FLT_INEXACT_RESULT:
break;
case EXCEPTION_FLT_INVALID_OPERATION:
break;
case EXCEPTION_FLT_OVERFLOW:
break;
case EXCEPTION_FLT_STACK_CHECK:
break;
case EXCEPTION_FLT_UNDERFLOW:
break;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
break;
case EXCEPTION_INT_OVERFLOW:
break;
case EXCEPTION_PRIV_INSTRUCTION:
break;
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
break;
default:
OutputDebugString("Unkown Error!\r\n");
break;
}
ExitThread(100000);
return dwErrCode;
}