ACE_Message_Block小知识

 每个ACE_Message_Block都有两个底层指针:rd_prt,wr_ptr,用于在消息块中读写数据。可以通过rd_ptr()和wr_ptr()方法来直接访问。
    rd_ptr指向下一次读取数据的位置,wr_ptr指向下一次写入数据的位置。这两个指针不会自动更新,程序员必须自己来增加他们的值!!!
    拷贝函数  int copy(const char *buf,size_t n);     buf指向要拷贝进消息块的缓冲区的指针,n指要拷贝数据的大小,该方法从wr_ptr指向的位置开始往前 写,并且保证wr_ptr的更新,使其指向缓冲区的新末尾处。
     base()和length()方法可以联合使用,以将消息块中的整个数据缓冲区拷贝出来。
    base()返回指向数据块的第一个数据条目的指针,
    length()返回队中数据的总大小。     base和length相加,可以得到指向数据块末尾的指针。
    duplicate()和clone()方法用于制作消息块的“副本“。
    clone()方法实际的创建整个消息块的新副本,包括他的数据块和附加部分。
    duplicate()方法使用ACE_Message_Block的引用计数机制,返回指向要被复制的消息块的指针,并在内部增加内部引用计数。
  release()释放消息块 ,如果消息数据内存石油该消息块分配的,调用release()方法就会释放此内存。如果消息块是引用计数的,release()就会减少计数,直到0为止。

1 copy() 不需要让写指针后移.
  ACE_Message_Block* mb = new ACE_Message_Block(BUFSIZ);
  mb->copy(buff); //buff先已经初始化
2 初始化mb后需要后移指针的情况
  2.1
  ACE_Message_Block* mb = new ACE_Message_Block(buff,len);
  mb->wt_ptr(len);  //len是buff的长度 len = strlen(buff) +1
                    // +1 表示后面的/0
  2.2
  ACE_Message_Block* mb = new ACE_Message_Block(BUFSIZ);
  ACE_OS::sprintf(mb->wt_ptr(),buff);
  mb->wt_ptr(len);
  2.3
  ACE_Message_Block* mb = new ACE_Message_Block(len,
            ACE_Message_Block::MB_DATA,
            mb2,   //表示 mb->cont(mb2)
            buff)
  mb->wt_ptr(len);
3.让消息接成串cont()时,千万不要直接或接间的把它接成一个环
   mb->cont(mb2);
   mb2->cont(mb3); //ok
   ***mb3->cont(mb);  //死定了
4.通知其它线程结束时,可以通过ACE_Message_Block::MB_STOP
 
  ACE_Message_Block* lastMsg =ACE_Message_Block ,ACE_Message_Block::MB_STOP)
  otherTask->putq(lastMsg);

  otherTask在接收到的时候如下处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值