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

📄 dispatch.cpp

📁 COM 组建的开发
💻 CPP
字号:
// Dispatch.cpp: implementation of the CDispatch class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"
#include "Dispatch.h"
#include "MSXMLParser.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDispatch::CDispatch()
{
	m_handleThread = NULL;
	m_dwThreadID = 0;
	m_hExitFlag = NULL;
}

CDispatch::~CDispatch()
{

}
// 启动工作线程 [5/12/2008 By willing]
DWORD CDispatch::Run()
{
	m_hExitFlag = ::CreateEvent(NULL, TRUE, FALSE, NULL);
	if (NULL == m_hExitFlag)
	{
		return -1;
	}
	m_handleThread = CreateThread( NULL, 0, DispatchThread,
									   ( LPVOID )this, NULL, &m_dwThreadID );
	if (NULL == m_handleThread)
	{
		return -2;
	}
	return 0;
}
// 分派线程主函数 [5/12/2008 By willing]
DWORD WINAPI CDispatch::DispatchThread(LPVOID lpParam)
{
	if (NULL == lpParam)
	{
		return -1;
	}
	CDispatch* ptrDispatch = (CDispatch*)lpParam;
	ST_IOITEM IOItem ;
	while (1)
	{
		if(::WaitForSingleObject(ptrDispatch->m_hExitFlag, 500) == WAIT_OBJECT_0)
			break;
		if (0 != _DataCenter.GetSetLstHead(IOItem))
		{
			continue;
		}

		ptrDispatch->DispatchTask(IOItem);
		// 释放内存 [5/12/2008 By willing]
		if (NULL != IOItem.pData)
		{
			delete IOItem.pData;
			IOItem.pData = NULL;
		}

	}
	return 0;
}
// 停止工作线程 [5/12/2008 By willing]
void CDispatch::Stop()
{
	if (NULL != m_hExitFlag)
	{
		::SetEvent(m_hExitFlag);
	}
	if (NULL != m_handleThread)
	{
		DWORD dwReCode = ::WaitForSingleObject(this->m_handleThread, 2000);
		if (WAIT_TIMEOUT == dwReCode)
		{
			// 如果等待超时就强制退出 [5/12/2008 By willing]
			::TerminateThread(m_handleThread,0);
		}
	}
	if(this->m_hExitFlag != NULL)
	{
		::CloseHandle(this->m_hExitFlag);
		this->m_hExitFlag = NULL;
	}

	this->m_handleThread = NULL;
	DEGBUGLOG("CDispatch","Stop","退出线程");
	return ;
}
void CDispatch::DispatchTask(const ST_IOITEM IOItem)
{

	CMSXMLParser MSXMLParser;
	int nCode = 0;
	CString strMsg = "";
	switch(IOItem.stType.wDataType)
	{
	case MODEL_POLICY:// 策略 [5/12/2008 By willing]
		strMsg.Format("文件加密模块收到策略:%s",CString(IOItem.pData));
		DEGBUGLOG("CDispatch","DispatchTask",strMsg);
		nCode = MSXMLParser.ParseConfig(CString(IOItem.pData),_ConfigInfo);
		if ( 0 != nCode)
		{
			DEGBUGLOG("CDispatch","DispatchTask","解析XML失败");
		}
		break;	
	case CLEAR_POLICY:// 清空当前正使用的策略 [5/12/2008 By willing]
		DEGBUGLOG("CDispatch","DispatchTask","文件加密模块收到清空策略命令");
		_ConfigInfo.ClearConfig();
		break;
	default:
		strMsg.Format("收到无法处理的任务 %d",IOItem.stType.wDataType);
		DEGBUGLOG("CDispatch","DispatchTask",strMsg);
		break;
	}
	return;
}

⌨️ 快捷键说明

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