📄 threadmgr.cpp
字号:
#include "stdafx.h"
#include "ThreadMgr.h"
#include "CrawlerMgr.h"
//////////////////////////////////////////////////////////////////////////
CThreadMgr* CThreadMgr::s_pThreadMgr = NULL;
//////////////////////////////////////////////////////////////////////////
CThreadMgr::CThreadMgr()
{
m_bFlagOver=FALSE;
m_bFlagExit=FALSE;
m_nThreadNumber=0;
for(int i=0;i<MAX_THREAD_NUMBER;i++)
{
m_hThreads[i]=NULL;
}
}
CThreadMgr* CThreadMgr::Instance()
{
if(s_pThreadMgr==NULL)
{
//build & proxy pattern
s_pThreadMgr = new CCrawlerMgr();
}
return s_pThreadMgr;
}
CThreadMgr::~CThreadMgr()
{
s_pThreadMgr=NULL;
}
void CThreadMgr::Release()
{
if(s_pThreadMgr!=NULL)
{
delete s_pThreadMgr;
}
s_pThreadMgr = NULL;
}
void CThreadMgr::SpawnV(int nNumber)
{
//sunwang,2007.2.1
PutOverFlag(FALSE);
m_nThreadNumber = (nNumber>MAX_THREAD_NUMBER?MAX_THREAD_NUMBER:nNumber);
for(int i=0;i<m_nThreadNumber;i++)
{
m_hThreads[i]=Spawn(i);
}
}
void CThreadMgr::ResumeAll()
{
for (int i=0;i<m_nThreadNumber;i++)
{
ResumeThread(m_hThreads[i]);
}
Sleep(1000);
}
void CThreadMgr::SupsendAll()
{
for (int i=0;i<m_nThreadNumber;i++)
{
SuspendThread(m_hThreads[i]);
}
Sleep(1000);
}
void CThreadMgr::StopAll()
{
m_bFlagExit = TRUE;
WaitForMultipleObjectsEx(m_nThreadNumber,m_hThreads,TRUE,INFINITE,TRUE);
for (int i=0;i<m_nThreadNumber;i++)
{
CloseHandle(m_hThreads[i]);
m_hThreads[i]=NULL;
}
m_nThreadNumber=0;
m_bFlagExit = FALSE; //reset flag
}
//////////////////////////////////////////////////////////////////////////
HANDLE CThreadMgr::Spawn(int nIndex)
{
HANDLE hHandle;
unsigned int dwId;
hHandle = (HANDLE)_beginthreadex(NULL,0,Worker,(void*)nIndex,CREATE_SUSPENDED,&dwId);
return hHandle;
}
unsigned __stdcall CThreadMgr::Worker(void* pArg)
{
int nIndex = (int)pArg;
DebugString("[CThreadMgr::Worker]","Worker(%d) spawn ok",nIndex);
CThreadMgr* pMgr = CThreadMgr::Instance();
while(!pMgr->GetExitFlag())
{
//任务完成
if(pMgr->DoWork(nIndex))
{
Sleep(3000);
pMgr->PutOverFlag(TRUE); //严格应该用所有线程的退出状态来做
break;
}
Sleep(5);
}
DebugString("[CThreadMgr::Worker]","Worker(%d) exit ok",nIndex);
return 0;
}
BOOL CThreadMgr::GetExitFlag()
{
return m_bFlagExit;
}
BOOL CThreadMgr::GetOverFlag()
{
return m_bFlagOver;
}
void CThreadMgr::PutOverFlag(BOOL bOver)
{
m_bFlagOver=bOver;
}
//////////////////////////////////////////////////////////////////////////
//dummy
BOOL CThreadMgr::DoWork(int nIndex)
{
DebugString("[CThreadMgr::DoWork]","Worker(%d) doing...",nIndex);
Sleep(1000);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -