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

模拟服务器

开发平台:

C/C++

  1. #include "KDBProcessThread.h"
  2. #include "kengine.h"
  3. #define MAX_PICKUP_NUM 5
  4. DWORD WINAPI DatabaseSaveThreadFun(void * pParam)
  5. {
  6. static char RoleBuffer[MAX_ROLEINFORMATION_SIZE];
  7. BYTE * pRoleBuffer = NULL;
  8. size_t nSize = 0;
  9. char szRoleName[100];
  10. while(1)
  11. {
  12. try
  13. {
  14. g_SaveDBThreadMark ++;
  15. if (g_SaveDBThreadMark > MAX_MARK_COUNT) g_SaveDBThreadMark = 0;
  16. nSize = 0;
  17. {
  18. CCriticalSection::Owner locker( g_RoleInfoSetMutex);
  19. list<KRoleInfomation*>::iterator I = g_RoleInfoList.begin();
  20. int nNodeCount = g_RoleInfoList.size();
  21. int nVisitTime = 0;
  22. while(I != g_RoleInfoList.end() && nVisitTime < nNodeCount && nSize == 0)
  23. {
  24. nVisitTime ++;
  25. if ((*I)->IsValid())
  26. {
  27. if ((*I)->m_bModify)//数据已被修改,但未存档,需要存档
  28. {
  29. nSize = MAX_ROLEINFORMATION_SIZE;
  30. BOOL bResult = (*I)->CopyRoleInfoBuffer((BYTE *)RoleBuffer, nSize);
  31. if (!bResult || nSize == 0) 
  32. {
  33. g_DebugLog("获得无效角色数据.普通错误");
  34. g_nMistakeCount ++;
  35. }
  36. else
  37. {
  38. sprintf(g_SaveMarkString, "正在保存角色%s......", GetRoleNameFromRoleBuffer(RoleBuffer));
  39. g_SaveDBThreadMark = MAX_MARK_COUNT + SAVEMARK_NO;
  40. (*I)->m_bModify = false;
  41. (*I)->m_nUnModifyTime = 0;
  42. }
  43. }
  44. else
  45. {
  46. (*I)->m_nUnModifyTime ++;
  47. if ((*I)->m_nUnModifyTime > 200)
  48. {
  49. size_t nTempSize =0;
  50. szRoleName[0] = 0;
  51. size_t nLen = 100;
  52. BOOL bResult = (*I)->GetRoleName(szRoleName, nLen);
  53. if (bResult && nLen > 0)
  54. {
  55. sprintf(g_RemoveMarkString, "正在释放角色信息%s......", szRoleName);
  56. g_SaveDBThreadMark = MAX_MARK_COUNT + REMOVEMARK_NO;
  57. }
  58. delete *I;
  59. g_RoleInfoList.pop_front();
  60. if (szRoleName)
  61. g_RoleInfoMap.erase(szRoleName);
  62. I = g_RoleInfoList.begin();
  63. continue;
  64. }
  65. }
  66. if (nNodeCount > 1)
  67. {
  68. KRoleInfomation * pRoleInfomation = *I;
  69. g_RoleInfoList.pop_front();
  70. g_RoleInfoList.push_back(pRoleInfomation);
  71. }
  72. }
  73. else
  74. {
  75. delete *I;
  76. g_RoleInfoList.pop_front();
  77. if (szRoleName)
  78. g_RoleInfoMap.erase(szRoleName);
  79. }
  80. I = g_RoleInfoList.begin();
  81. }
  82. }
  83. if (nSize > 0)
  84. {
  85. S3DBI_SaveRoleInfo((BYTE*)RoleBuffer, GetRoleNameFromRoleBuffer(RoleBuffer), 1);
  86. }
  87. Sleep(g_dwPerSaveTime);
  88. }
  89. catch(...)
  90. {
  91. g_DebugLog("存档线程出错!");
  92. g_nMistakeCount ++;
  93. }
  94. }
  95. return 1;
  96. }