bool NFActorModule::ExecuteEvent() { NFIActorMessage xMsg; bool bRet = false; bRet = mxQueue.TryPop(xMsg); while (bRet) { if (xMsg.msgType != NFIActorMessage::ACTOR_MSG_TYPE_COMPONENT && xMsg.xEndFuncptr != nullptr) { //Actor can be reused in ActorPool mode, so we don't release it. //>ReleaseActor(xMsg.nFormActor); ACTOR_PROCESS_FUNCTOR* pFun = xMsg.xEndFuncptr.get(); pFun->operator()(xMsg.nFormActor, xMsg.nMsgID, xMsg.data); NF_SHARE_PTR<NFIActor> xActor = mxActorMap.GetElement(xMsg.nFormActor); if (xActor) { if (xActor->GetNumQueuedMessages() <= 0) { int nActorID = xActor->GetAddress().AsInteger(); if (mxActorPool.find(nActorID) == mxActorPool.end()) { mxActorPool.insert(std::pair<int, int>(nActorID, 0)); } } } } bRet = mxQueue.TryPop(xMsg); } return true; }
void NFCActor::Handler(const NFIActorMessage& message, const Theron::Address from) { std::string strData = message.data; ACTOR_PROCESS_FUNCTOR_PTR ptrBegin = mxProcessFuntor.GetElement(message.nMsgID); if (ptrBegin != nullptr) { ACTOR_PROCESS_FUNCTOR* pFun = ptrBegin.get(); pFun->operator()(message.self, message.nFormActor, message.nMsgID, strData); } else { for (NF_SHARE_PTR<NFIComponent> pComponent = mxComponent.First(); pComponent != nullptr; pComponent = mxComponent.Next()) { if (pComponent->Enable()) { pComponent->OnASyncEvent(message.self, message.nFormActor, message.nMsgID, strData); } } } //////////////////////////////////////////////////////// // must return message NFIActorMessage xReturnMessage; xReturnMessage.msgType = NFIActorMessage::ACTOR_MSG_TYPE_END_FUNC; xReturnMessage.nMsgID = message.nMsgID; xReturnMessage.data = strData; xReturnMessage.self = message.self; xReturnMessage.nFormActor = this->GetAddress().AsInteger(); ACTOR_PROCESS_FUNCTOR_PTR ptrEnd = mxEndProcessFuntor.GetElement(message.nMsgID); if (ptrEnd != nullptr) { xReturnMessage.xEndFuncptr = ptrEnd; } else { //default end function if (mxDefaultEndProcessFuntor != nullptr) { xReturnMessage.xEndFuncptr = mxDefaultEndProcessFuntor; } } Send(xReturnMessage, from); }