找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4839|回复: 1

使用ACE_Task消息对列,从消息对列中获取消息时需要注意

[复制链接]
发表于 2008-7-15 23:58:04 | 显示全部楼层 |阅读模式
我使用的是ACE5.5版本,使用以静态连接库Unicode编码的方式使用
代码如下
int CProtocolProcessTask::svc()
{
ACE_Thread_Manager *mgr = this->thr_mgr();
ACE_ASSERT(mgr != NULL);
while(1)
{
//该服务被取消
if(mgr->testcancel(mgr->thr_self()))
return 0;

ACE_Message_Block *mb = NULL;
ACE_Time_Value tv(5);
int iRet = this->getq(mb,&tv);
if(iRet == -1 && errno == EWOULDBLOCK)
continue;
else
{
if(mb)
{
//协议逻辑入口
ProtocolProcessMessage(mb);
mb->release();
}
}
}
return 0;
}

主要是这两句话
ACE_Time_Value tv(5);
int iRet = this->getq(mb,&tv);
我设置的是5秒中的等待,可是this->getq(mb,&tv);从来不会等待,过后进入iRet == -1 && errno == EWOULDBLOCK逻辑,
我使用NULL会阻塞,不管tv(xx)中的数值有多大都会是这样,请高手给于解答,万分感谢

this->getq(mb,&tv)方法的第一个参数需要绝对时间,而不是你写成的相对时间,所以你应该改为

ACE_Time_Value tv(5);
tv += ACE_OS::time(0);
int iRet = this->getq(mb,&tv);

或者
ACE_Time_Value tv = ACE_OS::gettimeofday();
tv.sec (tv.sec () + 5);
int iRet = this->getq(mb,&tv);


另外退出线程最好不要用 testcancel,可以生成一个
ACE_Message_Block *mb = new ACE_Message_Block;
mb->msg_type(ACE_Message_Block::MB_HANGUP);
然后putq

在取出节点的时候判断消息类型退出线程
发表于 2011-3-15 14:30:13 | 显示全部楼层
文档中程序中有说明的,一直使用的都是绝对时间;
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-10 06:29 , Processed in 0.009168 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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