给代码的兄弟,帖子揭了。读了代码,发现还想找你要点东西,不知道能不能了。
//加入缓冲队列
    //AddReceiveData(pBuffer,nRet);
                                                    CPackage *pPackage = new CPackage(pBuffer,nRet);
                                                    pPackage->AddRef();
                                                    pRSPortObj->m_lstPackage.AddPackage(pPackage);
                                                    pPackage->Release();就是上述代码中的CPackage的源码和m_lstPackage的类源码,好人做到底啊

解决方案 »

  1.   

    这是我上次回答一个网友的问题,我不知道你要做什么用。建议你用两条线程来做,很典型的生产->消费模型,一条线程负责收数据,收到后加入缓冲队列中,另外一条线程负责转发.先启动接收线程开始接收数据,然后在转发线程中循环检查缓冲队列是否有数据,如果有将数据从缓冲队列中取出(从队列中删除)并发送.注意读写缓冲队列需要加锁.缓冲队列可以这样定义:
    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
      

  2.   

    //队列满,删除表头数据
          if(GetCount() > m_nMaxLen){
             CPackage *pOldPackage = RemoveHead();
            //释放引用
            pOldPackage->Release();
          }