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

📄 intpointmap.cpp

📁 SMS gateway. SMS protocol for CHINA mobile, unicom, lingtong. Using mysql to exchange message.
💻 CPP
字号:
/**********************************************************************
  FileName            : IntPointMap.cpp
  Description         : 整数-指针哈希映射类
  Version             : 1.0
  Date                : 2003年7月1日
  Author              : 刘荣辉
  Other               : 支持多线程的Map类,作为已发送队列(哈希表)
***********************************************************************/

#include "../include/IntPointMap.h"

//=====================构造函数===============================
CIntPointMap::CIntPointMap()
{
	MaxSize = 331;
}
//======================析构函数==============================
CIntPointMap::~CIntPointMap()
{
	sem_destroy(&WriteSem);
	sem_destroy(&AddLock);
	sem_destroy(&DelLock);	
}
//======================初始化==============================
void CIntPointMap::Map_Init(int size)
{
	MaxSize = size;
	sem_init(&WriteSem, 0, size);	//窗口大小初始化
	sem_init(&AddLock, 0, 1);
	sem_init(&DelLock, 0, 1);
}
//======================增加节点==============================
bool CIntPointMap::Add(unsigned int Sequence, char *pSUnit)
{
	/*if(sem_trywait(&WriteSem)!=0)	//窗口已满
	{
		return false;
	}*/
	sem_wait(&WriteSem);	//等待占用一个空闲窗口
	sem_wait(&AddLock);	//防止多个线程同时插入队列单元
	SentQ[Sequence] = pSUnit;
	sem_post(&AddLock);

	return true;
}
//======================获取最多MaxNum个节点============================
int  CIntPointMap::GetAllNode(char *Node[], int MaxNum)
{
	int iGot;
  	IntPointMap::iterator UnitPos;

	sem_wait(&AddLock);	//防止其他线程修改队列
	sem_wait(&DelLock); //防止其他线程修改队列
	
	iGot = 0;
	for(UnitPos = SentQ.begin(); UnitPos != SentQ.end(); ++UnitPos) 
	{
        Node[iGot] = UnitPos->second;
		iGot++;
		if(iGot==MaxNum)
			break;
    }

	sem_post(&DelLock);
	sem_post(&AddLock);

	return iGot;
}
//======================查找节点==============================
char * CIntPointMap::Find(int Num)
{
  	IntPointMap::iterator UnitPos;

	UnitPos = SentQ.find(Num);
	if (UnitPos == SentQ.end()) //没找到
	{
		return NULL;
	}
	else 
		return UnitPos->second;
}
//======================删除节点==============================
int CIntPointMap::Delete(int Num)
{
  	int DelNum;

	sem_wait(&DelLock);
	DelNum = SentQ.erase(Num);
	sem_post(&DelLock);
	sem_post(&WriteSem);//释放一个窗口

	return DelNum;
}
//======================查找获得并删除节点==============================
bool CIntPointMap::FindDel(unsigned int Sequence, char **pSUnit)
{
  	IntPointMap::iterator UnitPos;

	UnitPos = SentQ.find(Sequence);
	if (UnitPos == SentQ.end()) //没找到
	{
		*pSUnit = NULL;
		return false;
	}
	*pSUnit = UnitPos->second;
	sem_wait(&DelLock);
	SentQ.erase(UnitPos);
	sem_post(&DelLock);
	
	sem_post(&WriteSem);//释放一个窗口

	return true;
}
//======================测试窗口是否满==============================
bool CIntPointMap::IsFull()
{
	if((int)SentQ.size()==MaxSize) return true;
	else  return false;
}
//=============================================
int  CIntPointMap::GetSize()		//获取队列当前大小
{
	return SentQ.size();
}
int  CIntPointMap::GetMaxSize()	//获取队列最大容量
{
	return MaxSize;
}
//===================Map_Pos的位置初始化==========================
int  CIntPointMap::PosInit(Map_Pos *UnitPos)
{
	*UnitPos = SentQ.begin();
	return 0;
}
//================获取某位置的节点并指向下一个(首尾循环)==================
int CIntPointMap::GetNext(char **Node, Map_Pos *UnitPos)
{
	*Node = (*UnitPos)->second;
	if(*UnitPos == SentQ.end())
	{
		*UnitPos = SentQ.begin();
		return -1;	//返回-1表示已取出最后一个,下次将从头开始取
	}
	else
		(*UnitPos)++;

	return 0;
}

⌨️ 快捷键说明

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