美文网首页
IM客户端开发(4)——回调线程

IM客户端开发(4)——回调线程

作者: Magic11 | 来源:发表于2019-12-06 10:43 被阅读0次

回调线程需要不断地遍历回调队列queue<GSKResponse*> m_hasCallbackMap,一旦回调队列为空,它就阻塞

void GSKCNet::callbackLoop()
{
    SetCallbckLoop(true);
    SetExitCallbckLoop(false);
    std::mutex conlock;
    std::unique_lock < std::mutex > lck(conlock);
    while (GetCallbckLoop())
    {
        if (CallbackQueueIsEmpty())
        {
            if (GetCallbckLoop())
            {
                m_cv.wait(lck);
            }
            else
            {
                break;
            }
        }
        
        GSKResponse* p = GetCallbackFrontResp();
        if (p)
        {
            handleMsgCallBackF(p->code, p->stHead.seqid, p->stHead.wCmd, p->stHead.wClt,
                p->stHead.subCmd, p->GetMsg(), p->m_reqBody, p->cb);
            delete p;
        }
    }


    //等待接收线程退出(这样才能正确处理所有请求回调)最多500ms
    int num = 0;
    while (!GetExitRecvLoop())
    {
        glodon::sleep(10);
        ++num;
        if (num > 20)
        {
            break;
        }
    }
    
    LOGI_GSKCNET_INFO("callbackLoop() finish to wait recn thread exit num=%d",num);
    
    if (!CallbackQueueIsEmpty())
    {
        std::queue<GSKResponse*> tmpQ;
        SwapCallbackQueue(tmpQ);
        while (!tmpQ.empty())
        {
            GSKResponse* p = tmpQ.front();
            tmpQ.pop();
            if (p)
            {
                handleMsgCallBackF(p->code, p->stHead.seqid, p->stHead.wCmd, p->stHead.wClt,
                    p->stHead.subCmd, p->GetMsg(), p->m_reqBody, p->cb);
                delete p;
            }
        }
    }
    SetExitCallbckLoop(true);
}

调用回调函数的过程如下:

void GSKCNet::handleMsgCallBackF(int code, unsigned long long seqid, int cmd, int deviceType,
                        int subCmd, std::string msg, std::string reqMsg, GSKCNetCallbackType cb)
{
    __GSKNetArg stArg;
    stArg.iCode = code;
    stArg.iSeq = seqid;
    stArg.iCmd = cmd;
    stArg.iSubCmd = subCmd;
    stArg.iDeviceType = deviceType;
    stArg.strMsg = msg;
    stArg.requestMsg = reqMsg;
    if (cb)
    {
        cb(stArg);
    }
}

回调线程需要等待接收线程退出,因为接收线程会往回调队列里插入元素

相关文章

  • IM客户端开发(4)——回调线程

    回调线程需要不断地遍历回调队列queue m_hasCallbackMap,一旦回调队...

  • IM客户端开发(2)——发送线程

    1、 建立连接成功后,上层app会立即发送登录请求,登录成功之后就可以发送消息了,发送登录请求和发送消息都是调用...

  • AFN 同步请求

    需要把AFN的回调 放置在子线程 AFN的回调 默认在主线程,如果不把回调设置子线程, 那么 dispatch_s...

  • YTKNetwork的指定回调线程缺失

    AFNetworking指定completionQueue可以指定回调的线程.YTKNetwork写死了主线程回调...

  • python 处理多线程返回值

    python线程池有一个回调函数,可以通过回调函数处理线程返回值,线程池的回调函数默认有一个 workWorkRe...

  • IM客户端开发(3)——接收线程

    1、 接收线程负责发送心跳、读取消息、检查已发送的消息是否超时、检查网络是否还活着等 心跳发送的逻辑如下:当发送...

  • 线程 三

    目录 1.异步回调 2.线程队列 3.线程事件 4.单线程实现并发效果 5.greenlet模块 6.协程

  • 回调,同步异步

    nodejs学习笔记 标签:node 异步 回调 单线程 1. callback 最简单的回调 注意回调的理解:...

  • Android ble蓝牙问题

    声明:本文摘抄自博客园 (1)蓝牙回调安卓4.4的蓝牙回调是在异步线程中(不在主线程),若要在蓝牙回调中执行更新界...

  • 蓝牙ble开发注意事项

    (1)蓝牙回调 安卓4.4的蓝牙回调是在异步线程中(不在主线程),若要在蓝牙回调中执行更新界面的操作,记得切换到主...

网友评论

      本文标题:IM客户端开发(4)——回调线程

      本文链接:https://www.haomeiwen.com/subject/jvbsgctx.html