找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4340|回复: 2

proactor框架中的异步完成令牌参数act怎么使用?

[复制链接]
发表于 2008-9-9 19:07:58 | 显示全部楼层 |阅读模式
因为这个特性是windows特有的,所以书中只稍稍提了一下,没有进行演示。书上说他提供了一种方法来扩展在操作发起器和完成处理器之间所交流的信息的数量和类型,我想是不是可以控制异步写操作的速度(因为我的循环写操作可能太快,容易出问题,想找个办法解决一下),目前采取的笨方法是:对方接收到后回发一个同样的消息,收到后再发,效率不高。不知这个act参数能不能解决,哪位解释(演示)一下act参数的用法。谢谢
 楼主| 发表于 2008-9-9 19:08:14 | 显示全部楼层
由于异步操作可以多个同时发起,而且读写操作和完成回调过程是在不同的例程中,所以在完成回调过程必须知道当前回调对应的是哪个读写操作,这时act就可以起作用了,你可以使act指向读写操作的缓冲区,也可以指向结构体(包含操作id、缓冲区等)。不过因为unix不支持act,建议少用
 楼主| 发表于 2008-9-9 19:08:27 | 显示全部楼层
这个参数我用过.
在发起异步读的时候,传进去,用来标识一下这个写操作是"干什么"的,然后在"handle_read_stream()"根据act来选择不同的行为.
下面是代码片段

enum MessageTypes_T
    {
        MT_INVAILD = -1,
        MT_HEADER_FLAG = 10,
        MT_SIZE,
        MT_PAYLOAD_BODY,
        MT_SIZE_2,
        MT_TAIL_FLAG
    };



发起异步读操作的时候
  int result = this->read(header,(void*) MT_HEADER_FLAG);
处理"读操作完成"时
const void* act = result.act();
    intptr_t mode = (intptr_t) (act);
    switch(mode)
    {
    case MT_HEADER_FLAG :
        do
        {
            ACE_DEBUG((LM_DEBUG,ACE_TEXT("read header flag\n")));
            returnCode = this->completeMsgHeaderFlag(mb);
            if (returnCode == 0)
            {
                ACE_Message_Block *mb;
                ACE_NEW_NORETURN(mb,
                    ACE_Message_Block(2 * sizeof (ACE_UINT16),
                                      ACE_Message_Block::MB_DATA));
                int result = this->read(mb,(void*)MT_SIZE);
            }
            else
            {
                this->readError(MT_HEADER_FLAG);
            }
        } while (0);
     break;
    case MT_SIZE:
        do
        {
            ACE_DEBUG((LM_DEBUG,ACE_TEXT("read pack size complete\n")));
            returnCode = this->completeMsgSize(mb);
            if (returnCode == 0)
            {
                ACE_Message_Block *mb;
                ACE_NEW_NORETURN(mb,
                    ACE_Message_Block(this->payloadSize_ ,
                    ACE_Message_Block::MB_DATA));

                 this->read(mb,(void*)MT_PAYLOAD_BODY) ;
            }
            else
            {
                this->readError(MT_SIZE);
            }
        }while (0);
        break;
    case MT_PAYLOAD_BODY:
      
.....
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-4 17:48 , Processed in 0.018149 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表