fms.cpp

来自「概述:数据的纵向收集」· C++ 代码 · 共 147 行

CPP
147
字号
#include "stdafx.h"
#include "FMS.h"
#include "ThreadMgr.h"
#include "Template.h"
#include "IniUtil.h"
//////////////////////////////////////////////////////////////////////////
CFMS* CFMS::s_pFMS = NULL;

//////////////////////////////////////////////////////////////////////////
CFMS::CFMS()
{
	PutState(SS_STOPPED);
}

CFMS::~CFMS()
{
	PutState(SS_STOPPED);
	s_pFMS = NULL;

	//2007.2.1,sunwang
	CThreadMgr::Release();
}

CFMS* CFMS::Instance()
{
	if(s_pFMS==NULL)
	{
		s_pFMS = new CFMS();
	}
	return s_pFMS;
}

void CFMS::Release()
{
	if(s_pFMS!=NULL)
	{
		delete s_pFMS;
	}
	s_pFMS=NULL;
}

//任务完成后,通过轮询来自动复位
SPIDER_STATE CFMS::GetState()
{
	if(m_ssState!=SS_STOPPED)
	{
		if(CThreadMgr::Instance()->GetOverFlag())
		{
			HandleAction(SA_STOP);
		}
	}

	return m_ssState;
}

//将无效的输入过滤,形成真正的状态转移图,以后的处理函数里面就不用考虑异常情况了
void CFMS::HandleAction(SPIDER_ACTION saAction)
{
	switch(saAction)
	{
	case SA_START:
		if(m_ssState==SS_STOPPED)
		{
			DoStart();
		}
		else if (m_ssState==SS_SUSPENDED)
		{
			DoResume();
		}
		break;
	case SA_STOP:
		if(m_ssState==SS_WORKING || m_ssState==SS_SUSPENDED)
		{
			DoStop();
		}
		break;
	case SA_RESUME:
		if(m_ssState==SS_SUSPENDED)
		{
			DoResume();
		}
		break;
	case SA_SUSPEND:
		if(m_ssState==SS_WORKING)
		{
			DoSuspend();
		}
		break;
	default:
		break;
	}

	return;
}

void CFMS::PutState(SPIDER_STATE ssState)
{
	m_ssState = ssState;
}

//
//真正的状态转移函数
//
void CFMS::DoStart()
{
	//2007.2.12,template
	TCHAR lpszPath[MAX_PATH]={0};
	GetModuleFileName(g_hInstance,lpszPath,MAX_PATH);
	PathRemoveFileSpec(lpszPath);
	PathAppend(lpszPath,DEFAULT_TEMPLATE_FILE_EX);
	if(!NIniUtil::FileExist(lpszPath))
	{
		DebugString("[CFMS::DoStart]","no template file");
		return;
	}
	CTemplate* objTemplate = CTemplate::Instance();
	objTemplate->SetPath(lpszPath);
	objTemplate->Parse();

	CThreadMgr::Instance()->SpawnV(CTemplate::Instance()->GetThread());
	PutState(SS_SUSPENDED); //first spawn then resume
	DoResume();	
	return;
}

void CFMS::DoStop()
{
	DoResume();	//first resume then stop
	CThreadMgr::Instance()->StopAll();
	PutState(SS_STOPPED);
	return;
}

void CFMS::DoSuspend()
{
	CThreadMgr::Instance()->SupsendAll();
	PutState(SS_SUSPENDED);
	return;
}

void CFMS::DoResume()
{
	CThreadMgr::Instance()->ResumeAll();
	PutState(SS_WORKING);
	return;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?