⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threadmgr.cpp

📁 概述:数据的纵向收集
💻 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 + -