-
Notifications
You must be signed in to change notification settings - Fork 6
FAQs
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()函数中发送消息给其他服务
- 关于服务加载的顺序是根据配置文件中服务配置的顺序加载的.