c/c++语言开发共享kbengine unity3D 登录分析(初次登录流转过程)

上文说到流程到了Loginapp::login(),那么登录操作到了这里接下来会怎么走呢?往下看Loginapp.cpp996~1003:请求交给脚本操作1096~1100 会将用户名和密码交到Dbmgr上进行查询找到Dbmgr::onAccountLogin()105行将任务交给了数据库线程池。那么数据库线程池是怎么回事呢?以下虚线部分都是线程池的内容,如有了解可以跳过————————————…

上文说到流程到了Loginapp::login(),那么登录操作到了这里接下来会怎么走呢?往下看

Loginapp.cpp

kbengine unity3D 登录分析(初次登录流转过程)

kbengine unity3D 登录分析(初次登录流转过程)

kbengine unity3D 登录分析(初次登录流转过程)

996~1003:请求交给脚本操作

1096~1100 会将用户名和密码交到Dbmgr上进行查询

找到Dbmgr::onAccountLogin()

kbengine unity3D 登录分析(初次登录流转过程)

kbengine unity3D 登录分析(初次登录流转过程)

105行将任务交给了数据库线程池。

那么数据库线程池是怎么回事呢?以下虚线部分都是线程池的内容,如有了解可以跳过

———————————————————————————————————————————————————-

数据库线程池,每一个数据库接口都分配一个线程池,数据库接口在kbengine_defaults.xml中定义

kbengine unity3D 登录分析(初次登录流转过程)

数据库接口分配线程池在DBUtil的initialize()中,并用接口名称和线程池构成映射

db_interface.cpp

kbengine unity3D 登录分析(初次登录流转过程)

下图是获取某一数据库接口对应的线程池

db_interface.h

kbengine unity3D 登录分析(初次登录流转过程)

线程池:线程池中的线程进行了抽象,每一个线程都有一个成员curtask,将线程的运行函数中会执行curtask->process()。

CreatePool()创建线程池,这里会创建很多线程。

—————————————————————————————————————————————————–

kbengine unity3D 登录分析(初次登录流转过程)

531行的addTask就是之前pThreadPool所调用的,这里会调用到505行的_addTask(),重要的是516行,赋予线程所要做的任务。

kbengine unity3D 登录分析(初次登录流转过程)

上图是线程运行函数中的一段,可以看出线程会对所收到的task进行processTask处理(674行),处理完毕之后会将处理完成的task放到finiTaskList_(这一段没有截出最后一个处理任务的存放过程,但都是处理完成放到finiTaskList_)。

processTask调用的是task的process(),而对于DBTask(数据库任务),process()又会调用db_thread_process()(这里为了节省时间,就不再贴图)所以这里会调用的是DBTaskAccountLogin::db_thread_process(),这个函数主要就是去数据库查询账号密码。

DBTaskAccountLogin::db_thread_process()的最后部分

kbengine unity3D 登录分析(初次登录流转过程)

查询完毕了,接下来该怎么走呢?

想想kbengine(服务端)说到app.run是一直在近乎死循环运行的,要接着处理八成是在这个近乎死循环的地方进行处理。

去看循环

kbengine unity3D 登录分析(初次登录流转过程)

kbengine unity3D 登录分析(初次登录流转过程)

kbengine unity3D 登录分析(初次登录流转过程)

我们沿着processUntilbreak的processTimers()再到triggerTimer(),在triggerTimer()第249行,调用了handler的handleTimeout(),这个handler是Dbmgr(在初始化中可以找到)

handleTimeout中调用的是handleMainTick(),然后再调用DBUtil::handleMainTick(下图所示)

kbengine unity3D 登录分析(初次登录流转过程)

kbengine unity3D 登录分析(初次登录流转过程)

可以看到DBUtil::handleMainTick(),会逐个调用线程池的onMainThreadTick()

kbengine unity3D 登录分析(初次登录流转过程)

线程池会逐个调用线程池中每一个任务的presentMainThread()

我们加入的task是DBTaskAccountLogin,所以要调用DBTaskAccountLogin的presentMainThread()。

kbengine unity3D 登录分析(初次登录流转过程)

可以看到这里将DBTaskAccountLogin::db_thread_process()处理的结果都发送到给loginapp,并且调用LoginappInterface::onLoginAccountQueryResultFromDbmgr

Loginapp::onLoginAccountQueryResultFromDbmgr

kbengine unity3D 登录分析(初次登录流转过程)

kbengine unity3D 登录分析(初次登录流转过程)

这里主要干的事是:

将请求给脚本层进行处理

到baseapp上进行注册

Baseappmgr::registerPendingAccountToBaseapp

kbengine unity3D 登录分析(初次登录流转过程)

608行会找到负载最低的baseapp,其id是bestBaseappID_。

647行具体的注册在该baseapp上进行

Baseapp::registerPendingLogin kbengine unity3D 登录分析(初次登录流转过程)会将登录信息保存在ptinfos,后续客户端直接连 baseapp 时需要靠这个注册信息来进一步验证。

3703行再次转到basemgr,并且带上本baseapp的地址

kbengine unity3D 登录分析(初次登录流转过程)

这里的处理就是将登录信息和baseapp的地址给loginapp

(不太明白这里为什么baseapp不直接和loginapp通信,为什么要转到basemgr)

kbengine unity3D 登录分析(初次登录流转过程)

走了一圈之后,回到了loginapp。

1313行找到客户端的channel,并调用onLoginSuccessfully,指定这个消息由客户端的 onLoginSuccessfully 来响应,客户端的 Client_onLoginSuccessfully 函数将被调用

查看客户端

Kbengine.cs

kbengine unity3D 登录分析(初次登录流转过程)

906~908记录了baseapp的相关信息,914行登录baseapp,以后就是通过baseapp进行通信来处理任务

如此,一个登录的流程就正式完成。

c/c++开发分享kbengine unity3D 登录分析(初次登录流转过程)地址:https://blog.csdn.net/zzpzm/article/details/107865834

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/598247.html

(0)
上一篇 2021年5月8日
下一篇 2021年5月8日

精彩推荐