给代码的兄弟,帖子揭了。读了代码,发现还想找你要点东西,不知道能不能了。
//加入缓冲队列
//AddReceiveData(pBuffer,nRet);
CPackage *pPackage = new CPackage(pBuffer,nRet);
pPackage->AddRef();
pRSPortObj->m_lstPackage.AddPackage(pPackage);
pPackage->Release();就是上述代码中的CPackage的源码和m_lstPackage的类源码,好人做到底啊
//加入缓冲队列
//AddReceiveData(pBuffer,nRet);
CPackage *pPackage = new CPackage(pBuffer,nRet);
pPackage->AddRef();
pRSPortObj->m_lstPackage.AddPackage(pPackage);
pPackage->Release();就是上述代码中的CPackage的源码和m_lstPackage的类源码,好人做到底啊
class CPackage : public CObject
{
public:
CPackage(unsigned char * pData,int nSize){
m_lRef = 0; //引用次数
m_pData = NULL;
m_pDataLen = 0;
if(pData!=NULL && nSize >0){
m_pData = (unsigned char*)malloc(nSize);
memcpy(m_pData,pData,nSize);
m_nDataLen = nSize;
}
}
~CPackage(){
if(m_pData!=NULL)
free(m_pData);
m_pData = NULL;
m_nDataLen = 0;
}
//定义帮助函数
//1.引用管理
void AddRef(){m_lRef++;};
void Release(){
m_lRef--;
if(m_lRef <= 0)
delete this;
}
//获得数据,这里的lpBuffer使用者需要自己释放
int GetData(unsigned char *&lpBuffer){
if(m_pData!=NULL && m_nDataLen >0){
lpBuffer = (unsigned char*)malloc(m_nDataLen);
memcpy(lpBuffer,m_pData,m_nDataLen);
return m_nData;
}
lpBuffer = NULL;
return 0;
};
//数据
private:
unsigned char* m_pData;
int m_nDataLen;
};
//缓冲队列,可以用双向链表
class CPackageList : public CTypedPtrList<CObList,CPackage*>
{
public:
CPackageList();
~CPackageList(){
RemoveAll();
}
//帮助函数
public:
//向队列中加入数据
void AddPackage(CPackage *pPackage){
if(pPackage!=NULL ){
//增加引用次数
pPackage->AddRef();
//加入队列未部
AddTail(pPackage);
}
//队列满,删除表头数据
if(GetCount() < m_nMaxLen){
CPackage *pOldPackage = RemoveHead();
//释放引用
pOldPackage->Release();
}
}
CPackage *GetPackage(){
CPackage *pPackage = NULL;
if(!IsEmpty())
pPackage = RemoveHead();
return pPackage;
}
private:
//队列大小
int m_nMaxLen;
};//为了线程安全,在线程中引用对象均使用AddRef,和 Release(),处局部对象外最好不用DELETE
if(GetCount() > m_nMaxLen){
CPackage *pOldPackage = RemoveHead();
//释放引用
pOldPackage->Release();
}