zoukankan      html  css  js  c++  java
  • ACE_Message_Block功能简介

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607960.html

    ACE_Message_Block在Ace中用来表示消息的存放空间,可用做网络通信中的消息缓冲区,使用非常频繁,下面将在如下方简单的介绍一下ACE_Message_Block相关功能。

    1. 创建消息块
    2. 释放消息块
    3. 从消息块中读写数据
    4. 数据的拷贝
    5. 其它常用函数

    1。创建消息块

    创建消息块的方式比较灵活,常用的有以下几种方式 :

    1。直接给消息块分配内存空间创建。

        ACE_Message_Block *mb = new ACE_Message_Block (30);

    2。共享底层数据块创建。

        char buffer[100];
        ACE_Message_Block *mb = new ACE_Message_Block (buffer,30);

    这种方式共享底层的数据块,被创建的消息块并不拷贝该数据,也不假定自己拥有它的所有权。在消息块mb被销毁时,相关联的数据缓冲区data将不会被销毁。这是有意义的:消息块没有拷贝数据,因此内存也不是它分配的,这样它也不应该负责销毁它。

    3。通过duplicate()函数从已有的消息块中创建副本。

        ACE_Message_Block *mb = new ACE_Message_Block (30);
        ACE_Message_Block *mb2 = mb->duplicate();

    这种方式下,mb2和mb共享同一数据空间,使用的是ACE_Message_Block的引用计数机制。它返回指向要被复制的消息块的指针,并在内部增加内部引用计数。

    4。通过clone()函数从已有的消息块中复制。

        ACE_Message_Block *mb = new ACE_Message_Block (30);
        ACE_Message_Block *mb2 = mb->clone();

    clone()方法实际地创建整个消息块的新副本,包括它的数据块和附加部分;也就是说,这是一次"深拷贝"。

    2。释放消息块

    一旦使用完消息块,程序员可以调用它的release()方法来释放它。

    1. 如果消息数据内存是由该消息块分配的,调用release()方法就也会释放此内存。
    2. 如果消息块是引用计数的,release()就会减少计数,直到到达0为止;之后消息块和与它相关联的数据块才从内存中被移除。
    3. 如果消息块是通过共享已分配的底层数据块创建的,底层数据块不会被释放。

    无论消息块是哪种方式创建的,只要在使用完后及时调用release()函数,就能确保相应的内存能正确的释放。

    3。从消息块中读写数据

    ACE_Message_Block提供了两个指针函数以供程序员进行读写操作,rd_ptr()指向可读的数据块地址,wr_ptr()指向可写的数据块地址,默认情况下都执行数据块的首地址。下面的例子简单了演示它的使用方法。

     1 #include "ace/Message_Queue.h"
     2 #include "ace/OS.h"
     3 
     4 int main(int argc, char *argv[]) 
     5 {
     6     ACE_Message_Block *mb = new ACE_Message_Block (30);
     7     ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");
     8     ACE_OS::printf("%s
    ",mb->rd_ptr ());
     9     mb->release();
    10     return 0; 
    11 }

    注意:这两个指针所指向的位置并不会自动移动,在上面的例子中,函数执行完毕后,执行的位置仍然是最开始的0,而不是最新的可写位置5,程序员需要通过wr_ptr(5)函数手动移动写指针的位置。

    4。数据的拷贝

    一般的数据的拷贝可以通过函数来实现数据的拷贝,copy()还会保证wr_ptr()的更新,使其指向缓冲区的新末尾处。

    下面的例子演示了copy()函数的用法。

        mb->copy("hello");
        mb->copy("123",4);

    注意:由于c++是以''作为字符串结束标志的,对于上面的例子,底层数据块中保存的是"hello123",而用ACE_OS::printf("%s ",mb->rd_ptr ());打印出来的结果是"hello",使用copy函数进行字符串连接的时候需要注意。

    5。其它常用函数

    1. length()    返回当前的数据长度
    2. next()    获取和设置下一个ACE_Message_Block的链接。(用来建立消息队列非常有用)
    3. space()    获取剩余可用空间大小
    4. size()    获取和设置数据存储空间大小。
  • 相关阅读:
    安装APK失败,错误代码:INSTALL_FAILED_INVALID_APK 解决方案
    android保持服务不休眠(持续运行)以及唤醒屏幕的方法
    判断Android 当前版本是否为debug版本
    Android 使用WebView加载含有Canvas的页面截屏处理
    喜大普奔,微软Microsoft JDBC Driver For SQL Server已发布到maven中央仓库
    系统架构设计理论与原则、负载均衡及高可用系统设计速记
    Sharing A Powerful Tool For Application Auto Monitor
    Sharing A Powerful Tool For Calculate Code Lines
    关于GC和析构函数的一个趣题
    垃圾回收机制GC知识再总结兼谈如何用好GC
  • 原文地址:https://www.cnblogs.com/shmilxu/p/4860552.html
Copyright © 2011-2022 走看看