我使用的是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)中的数值有多大都会是这样,请高手给于解答,万分感谢

解决方案 »

  1.   

    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在取出节点的时候判断消息类型退出线程
      

  2.   

    谢谢您的解答anjuta_c(天天学习不退步)
      

  3.   

    ACE_Message_Block *mb = new ACE_Message_Block;
    mb->msg_type(ACE_Message_Block::MB_HANGUP);
    使用这种方法要求手动put退出消息到对列,并且如果起动了N个Task线程要求发送N个退出消息块,好处在于可以节约一定的CPU检测,并且实时性要更好
    使用testcancel只需一次调用cancel_task就可以了,而一个调用可由ACE框架自动在退出时调用的