请选择 进入手机版 | 继续访问电脑版

NoahFrame

 找回密码
 Register Now
搜索
热搜: redis mysql tutorial
查看: 755|回复: 4

NFCActor异步的时候的bug

[复制链接]

1

主题

5

帖子

61

积分

Registered member

Rank: 2

积分
61
发表于 2017-2-5 18:31:49 | 显示全部楼层 |阅读模式
void NFCActor::HandlerSelf(const NFIActorMessage& message, const Theron::Address from)
{
    std::string strData = message.data;

    if (mxComponent)
    {
        if (!mxComponent->HasInit())
        {
                        mxComponent->SetHasInit(true);

                        mxComponent->Init();
                        mxComponent->AfterInit();
        }

                mxComponent->OnASyncEvent(message.self, message.nMsgID, strData);

    }

    ////////////////////////////////////////////////////////

    NFIActorMessage xReturnMessage;

        xReturnMessage.nMsgID = 0;// message.nMsgID;
    xReturnMessage.data = strData;
    xReturnMessage.self = message.self;
    xReturnMessage.nFormActor = this->GetAddress().AsInteger();
    xReturnMessage.xEndFuncptr = mxFunctorEndPtr;

    Send(xReturnMessage, from);
}


上面的代码有个问题xReturnMessage.nMsgID = 0, 这样的话, 携带的数据在返回时, 比如:
int NFCAsyMysqlModule::RequestAsyEnd(const NFGUID& self, const int nFormActor, const int nEventID, const std::string& strData)
{
    int nRet = 0;
    switch (nEventID)
    {
        case NFCAsyMysqlModule::ACOTERMYSQLEVENT_UPDATA:
        {
            nRet = OnUpDataMysqlAsyEnd(self, nFormActor, nEventID, strData);
        }
        break;

这里的nEventID会一直为0, 那么switch就没意义了
回复

使用道具 举报

1

主题

5

帖子

61

积分

Registered member

Rank: 2

积分
61
 楼主| 发表于 2017-2-5 18:35:24 | 显示全部楼层
建议在类:
class NFIActorMessage
{
public:
        NFIActorMessage()
        {
                nMsgID = 0;
                nFormActor = 0;
        }

        int nMsgID;
        int nFormActor;
        std::string data;
        ////////////////////event/////////////////////////////////////////////////
        NFGUID self;
        //////////////////////////////////////////////////////////////////////////
        EVENT_ASYNC_PROCESS_END_FUNCTOR_PTR xEndFuncptr;
protected:
private:
};
里面加一个标志:bool isReturn; 用来区分是发送数据还是返回数据
回复 支持 反对

使用道具 举报

1

主题

5

帖子

61

积分

Registered member

Rank: 2

积分
61
 楼主| 发表于 2017-2-5 18:48:37 | 显示全部楼层
bool NFCActorModule::ExecuteEvent()
{
        NFIActorMessage xMsg;
        bool bRet = false;
        bRet = mxQueue.Pop(xMsg);
        while (bRet)
        {
                if (xMsg.nMsgID == 0)
                {
                        xMsg.xEndFuncptr->operator()(xMsg.self, xMsg.nFormActor, xMsg.nMsgID, xMsg.data);
                        //Actor can be reused in ActorPool mode, so we don't release it.
                        //m_pActorManager->ReleaseActor(xMsg.nFormActor);
                }

                bRet = mxQueue.Pop(xMsg);
        }

        return true;
}
这个函数也要修改, xMsg.nMsgID == 0
回复 支持 反对

使用道具 举报

30

主题

111

帖子

632

积分

Administrator

Rank: 9Rank: 9Rank: 9

积分
632
发表于 2017-2-6 10:17:16 | 显示全部楼层
问题已确认,确实存在这个情况,已在master分支修复。
回复 支持 反对

使用道具 举报

30

主题

111

帖子

632

积分

Administrator

Rank: 9Rank: 9Rank: 9

积分
632
发表于 2017-2-6 10:22:13 | 显示全部楼层
SHA-1: e11498e548348d81ccedb0094e1883c7c317e263

* fixed for actor module--can not reset message's id when return message to the main thread
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | Register Now

本版积分规则

 

GMT+8, 2018-8-15 13:53 , Processed in 0.070905 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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