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

📄 monitor.cpp

📁 一个多线程
💻 CPP
字号:
#include "stdafx.h"

#include "monitor.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CMonitorManager AFX_EXT_CLASS gbMonitorManager;
CUserMonitorManager AFX_EXT_CLASS gUserMonitorManager;
void CMonitorObjectGroup::RemoveObject(CMonitorObject *pOb){
	WaitForSingleObject(m_hMutex,INFINITE);
	try{
		BOOL bFind=FALSE;
		for(int i=0;i<m_iNumOfObject;i++){
			if(bFind)m_pCMonitorObjectList[i-1]=m_pCMonitorObjectList[i];
			else if(m_pCMonitorObjectList[i]==pOb){
				bFind=TRUE;
			}
		}
		if(bFind){
			m_iNumOfObject--;
			if(m_MaxNumOfObject>m_iNumOfObject+PRENUMBEROFOBJECT){
				m_MaxNumOfObject-=PRENUMBEROFOBJECT;
				CMonitorObject * * p=new  CMonitorObject* [m_MaxNumOfObject];
				ASSERT(p);
				memcpy(p,m_pCMonitorObjectList,m_iNumOfObject*sizeof(CMonitorObject*));
				delete [] m_pCMonitorObjectList;
				m_pCMonitorObjectList=p;
			}
			m_bUpDateAll=TRUE;
			pOb->pGroup=NULL;
		}
	}
	catch(...){
	}
	ReleaseMutex(m_hMutex);
};

void CMonitorObjectGroup::AddObject(CMonitorObject * pOb){
	try{
		if(!m_iNumOfColum){
			m_iNumOfColum=pOb->GetFeatureorStatusNum();
			if(m_iNumOfColum){
				m_pColumList=new UniVar[m_iNumOfColum];
				ASSERT(m_pColumList);
				for(int i=0;i<pOb->GetFeatureorStatusNum();i++){
					pOb->GetFeatureorStatusNameFromIdx(m_pColumList[i],i);
				}
			}
		}
	}
	catch(...){
		return;
	}
	WaitForSingleObject(m_hMutex,INFINITE);
	try{
		if(m_MaxNumOfObject==m_iNumOfObject){
			m_MaxNumOfObject+=PRENUMBEROFOBJECT;
			CMonitorObject * * p=new  CMonitorObject* [m_MaxNumOfObject];
			ASSERT(p);
			memcpy(p,m_pCMonitorObjectList,m_iNumOfObject*sizeof(CMonitorObject*));
			delete [] m_pCMonitorObjectList;
			m_pCMonitorObjectList=p;
		}
		m_pCMonitorObjectList[m_iNumOfObject++]=pOb;
		pOb->pGroup=this;
	}
	catch(...){
	}
	ReleaseMutex(m_hMutex);
};

BOOL CMonitorObject::GetFeatureorStatusChanged(int idx){
	if(idx<0){
		if(m_bChanged){
			return TRUE;
		}
		return FALSE;
	}
	if(!m_iStatusKeyNum||m_iStatusKeyNum<=idx)return FALSE;
	if(m_pbChanged[idx]){
		m_pbChanged[idx]=0;
		m_bChanged--;
		return TRUE;
	}
	return FALSE;
}

CMonitorObject::CMonitorObject()
{
	m_pbChanged=NULL;
	pGroup=NULL;
	m_iStatusKeyNum=0;
}

CMonitorObject::~CMonitorObject(){
//	if(CMonitorObjectGroup::IsValid(pGroup))	pGroup->RemoveObject(this);
	if(pGroup->IsValid(pGroup))	pGroup->RemoveObject(this);
	if(m_pbChanged)delete [] m_pbChanged;
}

void CMonitorObject::SetFeatureorStatusChanged(int idx){
	if(!m_iStatusKeyNum||m_iStatusKeyNum<=idx||idx<0)return ;
	if(!m_pbChanged[idx]){
		m_pbChanged[idx]=1;
		m_bChanged++;
	};
	pGroup->m_bUpdateS=TRUE;
};

void CMonitorObject::RegisterMonitor()
{
	if(gbMonitorManager.m_bSetMonitor){
		m_iStatusKeyNum=GetFeatureorStatusNum();
		m_pbChanged=NULL;
		if(m_iStatusKeyNum>0){
			m_pbChanged=new BOOL[m_iStatusKeyNum];
			if(!m_pbChanged){
				m_iStatusKeyNum=0;
			}
			else {
				for(int i=0;i<m_iStatusKeyNum;i++){
					m_pbChanged[i]=1;
				}
			}
		}
		else m_iStatusKeyNum=0;
		m_bChanged=m_iStatusKeyNum;
		pGroup=gbMonitorManager.AddObject(this);
		ASSERT(pGroup);
	}
};

CMonitorObjectGroup * CMonitorGroupManager::AddObject(CMonitorObject *pOb)
{
	UniVar p;
	pOb->GetObjectName(p);
	CMonitorObjectGroup * pO=NULL;
	WaitForSingleObject(m_hMutex,INFINITE);
	try{
		for(int i=0;i<m_pGroupArray.GetSize();i++){
			if(p.IsSame(m_pGroupArray[i]->m_uvGroupName)){
				pO=m_pGroupArray[i];
			}
		}
	}
	catch(...){
	}
	ReleaseMutex(m_hMutex);
	if(!pO){
		WaitForSingleObject(m_hMutex,INFINITE);
		try{
			pO=new CMonitorObjectGroup(p);
			m_pGroupArray.Add(pO);
		}
		catch(...){
		}
		ReleaseMutex(m_hMutex);
	}
	pO->AddObject(pOb);
	return pO;
}

CUserMonitorManager::CUserMonitorManager(){
	m_hMutex=CreateMutex(NULL,FALSE,NULL);
	ASSERT(m_hMutex);
	m_MonitorStr.RemoveAll();
};

CUserMonitorManager::~CUserMonitorManager(){
	for(int i=0;i<m_GrpList.GetSize();i++){
		delete [] m_GrpList[i]->pFName;
		delete m_GrpList[i];
	}
	for(i=0;i<m_UserList.GetSize();i++){
		delete m_UserList[i];
	}
	CloseHandle(m_hMutex);
	m_MonitorStr.RemoveAll();
};

CUserMonitor * CUserMonitorManager::CreateUserMonitorObject(UniVar uvGName,UniVar uvOName,int iNum,UniVar * puvFName,BOOL bShare)
{
	if(gbMonitorManager.m_bSetMonitor){
		if(uvGName.IsEmpty()||uvOName.IsEmpty())return NULL;
		if(iNum<=0)return NULL;
		UniVar p="用户自定义";
		p=p+uvGName;
		UserMoGrp * pGrp=NULL;
		GetRight();
		if(m_MonitorStr.Lookup((LPCTSTR)p,(void * &)pGrp)){
			if(pGrp->iNum!=iNum){
				ReleaseRight();
				return NULL;
			}
		}
		else {
			pGrp=new UserMoGrp;
			pGrp->iNum=iNum;
			pGrp->uvName=uvGName;
			pGrp->pFName=new UniVar[iNum];
			for(int i=0;i<iNum;i++)
				pGrp->pFName[i]=puvFName[i];
			m_MonitorStr.SetAt((LPCTSTR)p,(void * &)pGrp);
			m_GrpList.Add(pGrp);
		}
		p=p+uvOName;
		CUserMonitor * pUm=NULL;
		if(m_MonitorStr.Lookup((LPCTSTR)p,(void * &)pUm)){
			ReleaseRight();
			return pUm;
		}
		else {
			pUm=new CUserMonitor(uvOName,pGrp,this,bShare);
			m_UserList.Add(pUm);
			m_MonitorStr.SetAt((LPCTSTR)p,(void * &)pUm);
			pUm->RegisterMonitor();
		}
		ReleaseRight();
		return pUm;
	}
	return NULL;
}

⌨️ 快捷键说明

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