找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5627|回复: 11

[l老大,在线等]关于 getq()的疑问?希望有人解答

[复制链接]
发表于 2008-11-25 17:06:43 | 显示全部楼层 |阅读模式
这段代码来自网上,如下:
#include "ace/OS.h"
#include "ace/Message_Block.h"
#include "Task_Worker.h"
namespace ACE_Server
{
int Task_Worker::svc(void)//  线程处理函数
{
while(1)
{
ACE_Message_Block *mb = NULL;
if(this->getq(mb) == -1)//问题在这里,一次只能获取队列中的一个信息,所以这里进行循环,我想获得队列多个内容并保存起来如何处理?
{
continue;
}
process_task(mb);//处理这条消息
}
return 0;
}
void Task_Worker::process_task(ACE_Message_Block *mb)
{
//进行数据处理,数据的起始地址为mb->rd_ptr(),长度为mb->length()
ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t) Processing task: %s length %d\n"), mb->rd_ptr(), mb->length()));
//在这里处理队列中的消息,我构思着把队列中获得的一个一个内容保存起来,然后一并处理,该如何做?
ACE_OS::sleep(3); //模拟数据处理过程
mb->release();
}
}

[ 本帖最后由 marry 于 2008-11-25 18:13 编辑 ]
 楼主| 发表于 2008-11-25 17:11:53 | 显示全部楼层
:hug: 等待回复中!
发表于 2008-11-25 19:39:04 | 显示全部楼层
不明白,你要保存成什么样的东西?
保存了以后不也要像处理这个queue一样,写一个while来循环处理么?
 楼主| 发表于 2008-11-25 19:48:51 | 显示全部楼层
比如消息队列分别有两个信息:”信息1“和”信息2“
第一次的循环:
if(this->getq(mb) == -1)
这里只取得了“信息1”
第2次的循环我想在保存“信息1”的情况下获得“信息2”
最后同时对“信息1”和“信息2”进行操作

[ 本帖最后由 marry 于 2008-11-25 19:57 编辑 ]
发表于 2008-11-25 22:31:01 | 显示全部楼层
用ACE_Message_Block的内部链表功能即可。就是设置cont(),把信息1和信息2连接在一起,取的时候,getq只会get一个完整的消息,然后你读取消息1的cont(),取得信息2即可。
so easy,非常简单方便。
 楼主| 发表于 2008-11-26 09:41:39 | 显示全部楼层
老大的意思是客户端:
        Client client("localhost"); //服务器的IP地址或者服务器名称
        //for(int i = 0; i < 5; i++)
        //{
        char *task1 = "Is it a good day?"; //第1个task的数据
        size_t task1_len = 18; //第1个task的数据长度
        char *task1_t; //无需修改
        ACE_NEW_RETURN(task1_t, char[task1_len + 4], -1); //无需修改
        client.put_task(task1_t, task1, task1_len); //无需修改

        char *task2 = "Yeah, it really is."; //第2个task的数据
        size_t task2_len = 20; //第2个task的数据长度
        char *task2_t; //无需修改
        ACE_NEW_RETURN(task2_t, char[task2_len + 4], -1); //无需修改
        client.put_task(task2_t, task2, task2_len); //无需修改

        client.send_tasks(); //将上面的task全部发到服务器
        delete [] task1_t; //释放task1的内存
        delete [] task2_t; //释放task2的内存
        head->release();
        //}
        return 0;

这段代码没有形成链表的形式发送出去,而且单个进行发送?如果是这样就必须先按照老大说的做了?
:P  老大能不能写个连接这两个的代码让我们学习下:)

[ 本帖最后由 marry 于 2008-11-26 09:43 编辑 ]
发表于 2008-11-26 11:28:33 | 显示全部楼层
#include "ace/OS.h"
#include "ace/Message_Block.h"

int main (int argc, char *argv[])
{
  ACE_Message_Block *head = new ACE_Message_Block (BUFSIZ);
  ACE_Message_Block *mblk = head;

  for (;;) {
    ssize_t nbytes = ACE::read_n (ACE_STDIN,
                                  mblk->wr_ptr (),
                                  mblk->size () ) ;
    if (nbytes <=  0)
      break; // Break out at EOF or error.

    // Advance the write pointer to the end of the buffer.
    mblk->wr_ptr (nbytes);

    // Allocate message block and chain it at the end of list.
    mblk->cont (new ACE_Message_Block (BUFSIZ));
    mblk = mblk->cont ();
  }
  // Print the contents of the list to the standard output.
  for (mblk = head; mblk != 0; mblk = mblk->cont ())
    ACE::write_n (ACE_STDOUT, mblk->rd_ptr (), mblk->length ());

  head->release (); // This releases all the memory in the chain.
  return 0;
}
 楼主| 发表于 2008-11-26 11:29:30 | 显示全部楼层
老大,真迅速,多谢,我研究下!
老大,在网上看到这个,蛮实用的,就是不知道如何在实际中用:


让消息接成串cont()时,千万不要直接或接间的把它接成一个环
    mb->cont(mb2);
    mb2->cont(mb3); //ok
    ***mb3->cont(mb);   //死定

我今天任务就是把消息成串发送出去,有了例子掌握就是快点

[ 本帖最后由 marry 于 2008-11-26 11:45 编辑 ]
 楼主| 发表于 2008-11-26 13:31:26 | 显示全部楼层
char *Client::put_task(char *msg_t, char *msg_s, size_t msg_len)
{
        for(int i = 0; i < 4; i++)
{
        msg_t = (char)((msg_len >> (8 * i)) & 0xff);
}
        ACE_OS::memcpy(&msg_t[4], msg_s, msg_len);
        //ACE_Message_Block *mb = NULL;
        ACE_Message_Block *head = new ACE_Message_Block (BUFSIZ);///////////////////////
    ACE_Message_Block *mb = head;///////////////////////
        ACE_NEW_RETURN(mb, ACE_Message_Block(msg_len + 4, ACE_Message_Block::MB_DATA, 0, msg_t), 0);
        mb->wr_ptr(msg_len + 4);
        mb->cont (new ACE_Message_Block (BUFSIZ));///////////////////////
        mb = mb->cont ();//////////////////////////////////
        this->putq(mb);
        head->release ();/////////////////////////////////
return msg_t;
}

老大,能帮我看看这段代码有问题没有
发表于 2008-11-26 15:53:24 | 显示全部楼层
汗,我没看明白。自己锻炼着去琢磨,不能老靠别人帮忙啊。
你肯定书读的不够。我上面的代码就是书上面的啊,原本照抄来的。
C++网络编程卷1、卷2是必须读的。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 09:14 , Processed in 0.024261 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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