KDBLoadThread.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "KDBProcessThread.h"
  2. #include "kengine.h"
  3. //循环处理向数据库请求获得玩家信息的操作 
  4. DWORD WINAPI DatabaseLoadThreadFun(void * pParam)
  5. {
  6. list<TGetRoleInfoFromDB *>::iterator I;
  7. TGetRoleInfoFromDB GetRoleInfoCmd;
  8. while(1)
  9. {
  10. try
  11. {
  12. g_LoadDBThreadMark ++;
  13. if (g_LoadDBThreadMark > MAX_MARK_COUNT) g_LoadDBThreadMark = 0;
  14. bool bFind = false;
  15. {
  16. CCriticalSection::Owner locker( g_GetRoleInfoMutex );
  17. I = g_DBLoadThreadCmdList.begin();
  18. if (I != g_DBLoadThreadCmdList.end())
  19. {
  20. GetRoleInfoCmd.nNetId = (*I)->nNetId;
  21. strcpy(GetRoleInfoCmd.szRoleName, (*I)->szRoleName);
  22. GetRoleInfoCmd.ulIdentity = (*I)->ulIdentity;
  23. delete *I;
  24. g_DBLoadThreadCmdList.pop_front();
  25. bFind = true;
  26. }
  27. }
  28. if (bFind)
  29. {
  30. static unsigned char szRoleInfo[MAX_ROLEINFORMATION_SIZE];
  31. int nBufferSize = MAX_ROLEINFORMATION_SIZE;
  32. sprintf(g_LoadMarkString, "正在数据库读取角色%s......", GetRoleInfoCmd.szRoleName);
  33. g_LoadDBThreadMark = MAX_MARK_COUNT + LOADMARK_NO; 
  34. if (!S3DBI_GetRoleInfo(szRoleInfo, GetRoleInfoCmd.szRoleName, nBufferSize)) continue;
  35. if (nBufferSize > MAX_ROLEINFORMATION_SIZE)
  36. {
  37. ASSERT(0);
  38. g_DebugLog("获得的角色数据超长!");
  39. g_nMistakeCount ++;
  40. }
  41. //增加角色数据和向两个列表增加数据
  42. const char * szName = (const char *)(GetRoleInfoCmd.szRoleName);
  43. if (szName)
  44. {
  45. {
  46. CCriticalSection::Owner locker(g_RoleInfoSetMutex);
  47. KRoleInfomation * pRoleInfomation = g_RoleInfoMap[szName] ;
  48. if (!pRoleInfomation)//新加角色!
  49. {
  50. KRoleInfomation * pNewRoleInfomation = new KRoleInfomation;
  51. pNewRoleInfomation->SetRoleInfoBuffer(szRoleInfo, nBufferSize);
  52. g_RoleInfoMap[szName] = pNewRoleInfomation;
  53. g_RoleInfoList.push_back(pNewRoleInfomation);
  54. }
  55. }
  56. TCmd * pNewCmd = (TCmd *)new char [sizeof(TCmd)  + strlen(szName) - 1];
  57. pNewCmd->ulNetId = GetRoleInfoCmd.nNetId;
  58. pNewCmd->ProcessData.nProtoId = c2s_roleserver_getroleinfo;
  59. pNewCmd->ProcessData.nDataLen = strlen(szName);
  60. pNewCmd->ProcessData.ulIdentity = GetRoleInfoCmd.ulIdentity;
  61. memcpy(&pNewCmd->ProcessData.pDataBuffer[0], szName, strlen(szName));
  62. CCriticalSection::Owner locker(g_MainMsgListMutex);
  63. g_MainThreadCmdList.push_back(pNewCmd);
  64. }
  65. }
  66. Sleep(1);
  67. }
  68. catch(...)
  69. {
  70. g_nMistakeCount ++;
  71. g_DebugLog("DBLoad Throw Error!");
  72. }
  73. }
  74. return 1;
  75. }