www.pudn.com > 0818ThreadPool.rar > WorkThreadPool.cpp
// WorkThreadPool.cpp: implementation of the CWorkThreadPool class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Thread.h"
#include "threadpoolmodel.h"
#include "WorkThreadPool.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CWorkThreadPool *g_pPool;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWorkThreadPool::CWorkThreadPool() :
m_exit(false,true),m_signal(false,true)
{
pf = NULL;
m_threadNum = 3;
}
CWorkThreadPool::~CWorkThreadPool()
{
}
int CWorkThreadPool::Run()
{
BOOL bResult=TRUE;
SetCurAllThreadCount(3);
SetMaxThreadCount(5);
for(int i=0;iDecrementCurAllThreadCount( );
return ERROR_GLOBPOOL_NULL;
}
TRACE("Work Thread Start\n");
//取得当前线程ID
DWORD dwThreadId=GetCurrentThreadId( );
DWORD dwIndex=0;
int nTemp=2;
//声明一个事件数组用于等待事件
LPHANDLE pEvent=new HANDLE[nTemp];
pEvent[0]=g_pPool->GetWorkEvent(); //获取工作事件标志
pEvent[1]=m_exit;
while(TRUE)
{
//等待多事件响应,等待工作事件,死亡事件,全局死亡事件
//如果有一个事件被置为信号态,则继续运行,否则保持等待
dwIndex=WaitForMultipleObjects(2,pEvent,FALSE,INFINITE);
//如果等待返回结果为错误,继续运行
if(dwIndex==WSA_WAIT_FAILED)
{
Sleep(300);
continue;
}
g_pPool->IncrementCurWorkThreadCount( );
DWORD dwTemp=0;
dwTemp=dwIndex-WSA_WAIT_EVENT_0;
switch(dwTemp)
{
//dwTemp返回值为1表示线程要结束
case 1://均为死亡
g_pPool->DecrementCurWorkThreadCount( );
goto CLEAR;
break;
case 0:
break;
}
if(dwTemp!=0)
{
g_pPool->DecrementCurWorkThreadCount( );
continue;
}
//线程开始工作
//取得工作内容
LPVOID pItem = GetNextItem();
if(pItem)
{
RemoveWorkItem(pItem);
pf(pItem);
}else
{
m_signal.ResetEvent();
}
}
CLEAR:
if(pEvent!=NULL)
{
delete []pEvent;
pEvent=NULL;
}
g_pPool->DecrementCurAllThreadCount( );
return SUCCESS_THREAD_RETURN;
}
UINT CWorkThreadPool::WORK(LPVOID lp)
{
CWorkThreadPool* pWork = (CWorkThreadPool*)lp;
ASSERT(pWork);
pWork->Work();
return 0;
}
void CWorkThreadPool::Stop()
{
m_signal.ResetEvent();
m_exit.SetEvent();
}
//删除工作队列
void CWorkThreadPool::RemoveWorkItem(LPVOID _pItem)
{
LPVOID pItem = NULL;
m_lock.Lock();
for(int i=0;i 0);
m_threadNum = num;
}