Skip to content
lkpworkspace edited this page Dec 3, 2019 · 6 revisions

服务中使用周期性定时器会出现定时器超时与设置的超时不符合?

假设A服务中每次调用Timeout()就会向定时器线程发送一个定时器消息,在定时器超时时就会向A服务发送一个超时消息;如果B服务也向A服务发送一个文本消息,在没有判断该消息是否是超时消息时又调用一次Timeout()函数,那么就相当于又一次设置了一次超时。解决该问题的方法就是A服务收到消息时判断是否是超时消息,如果是再调用Timeout()函数。

  • 错误示例:
virtual int CB(MyMsg* msg) override
{
    /* 设置下一次超时时间 100 * 10 ms */
    Timeout(GetHandle(), 100, 0xff);

    // 处理其它的事情
    // TODO...

    return 1;
}
  • 正确示例:
virtual int CB(MyMsg* msg) override
{
    switch(msg->GetMsgType()){
        case MyMsg::MyMsgType::RESPONSE:{
            MyRespMsg* rmsg = static_cast<MyRespMsg*>(msg);
            if(rmsg->GetRespMsgType() == MyRespMsg::MyRespMsgType::TIMER){
                /* 设置下一次超时时间 100 * 10 ms */
                Timeout(GetHandle(), 100, 0xff);
            }
            break;
        }
        // 处理其它的消息
        // TODO...
    }
    // 处理其它的事情
    // TODO...

    return 1;
}

服务在初始化中发送消息给另一个服务, 另一个服务未收到消息?

假设A服务在初始化函数中向B服务发送消息, 让我们了解一下它的处理流程:

  • myframe框架在调用A服务的初始化函数后,就会将A服务的消息分发给其他服务.

如果此时将消息分发给B服务, 但B服务未在A服务之前加载,那么A发送的消息 就会找不到对应的服务导致消息丢失. 所以建议不要再Init()函数中发送消息给其他服务

  • 关于服务加载的顺序是根据配置文件中服务配置的顺序加载的.

Clone this wiki locally