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

模拟服务器

开发平台:

C/C++

  1. //-----------------------------------------//
  2. //                                         //
  3. //  File : S3PRelockAccount.h    //
  4. // Author : Yang Xiaodong            //
  5. // Modified : 8/28/2002                //
  6. //                                         //
  7. //-----------------------------------------//
  8. #include "S3PDBConnection.h"
  9. #include "S3PRow.h"
  10. #include "S3PAccountInfoDAO.h"
  11. #include "S3PDBConnector.h"
  12. #include "S3PRelockAccount.h"
  13. S3PRelockAccount* S3PRelockAccount::m_pInstance = NULL;
  14. HANDLE S3PRelockAccount::m_hEnable = NULL;
  15. DWORD S3PRelockAccount::m_dwCycle = 60000; // One minute
  16. S3PRelockAccount::S3PRelockAccount()
  17. {
  18. Init();
  19. }
  20. S3PRelockAccount::~S3PRelockAccount()
  21. {
  22. }
  23. S3PRelockAccount* S3PRelockAccount::Instance()
  24. {
  25. if ( NULL == m_pInstance )
  26. {
  27. m_pInstance = new S3PRelockAccount;
  28. }
  29. return m_pInstance;
  30. }
  31. void S3PRelockAccount::ReleaseInstance()
  32. {
  33. if ( NULL != m_pInstance )
  34. {
  35. delete m_pInstance;
  36. m_pInstance = NULL;
  37. }
  38. }
  39. static DWORD WINAPI Relock( LPVOID lpParam )
  40. {
  41. DWORD dwRet = 0;
  42. if ( NULL == lpParam )
  43. {
  44. return dwRet;
  45. }
  46. _LPRELOCKERPARAM lpRelocker = ( _LPRELOCKERPARAM )lpParam;
  47. if ( NULL == lpRelocker->hEnable )
  48. {
  49. return dwRet;
  50. }
  51. S3PDBConnection* pAccountCon =
  52. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  53. if ( NULL != pAccountCon )
  54. {
  55. while ( TRUE )
  56. {
  57. DWORD dwResult =
  58. KPIWaitForSingleObject( lpRelocker->hEnable, lpRelocker->dwCycle );
  59. if ( 1 == dwResult ) // The thread is commanded to exit.
  60. {
  61. break;
  62. }
  63. else if ( 2 == dwResult ) // Time out
  64. {
  65. // Relocks specified data section
  66. //------>BEGIN
  67. pAccountCon->Do( "update account_info set iGameId = 0 where iGameId <> 0 and iTimeCount = 0" );
  68. pAccountCon->Do( "update account_info set iTimeCount = 0 where iGameId <> 0 and iTimeCount <> 0" );
  69. //<------END
  70. }
  71. }
  72. pAccountCon->Close();
  73. }
  74. return dwRet;
  75. }
  76. HANDLE S3PRelockAccount::Start()
  77. {
  78. HANDLE hRet = NULL;
  79. if ( NULL != m_hRelocker ) // The thread has been running.
  80. {
  81. return hRet;
  82. }
  83. if ( NULL == m_hEnable )
  84. {
  85. m_hEnable = KPICreateEvent( NULL, TRUE, TRUE, def_RELOCKEVENTNAME );
  86. }
  87. if ( NULL != m_hEnable )
  88. {
  89. KPIResetEvent( m_hEnable );
  90. }
  91. m_param.dwCycle = m_dwCycle;
  92. m_param.hEnable = m_hEnable;
  93. m_hRelocker = KPICreateThread( Relock, &m_param, &m_dwRelockerID );
  94. hRet = m_hRelocker;
  95. return hRet;
  96. }
  97. BOOL S3PRelockAccount::Stop()
  98. {
  99. BOOL bRet = FALSE;
  100. if ( NULL == m_hRelocker )
  101. {
  102. return bRet;
  103. }
  104. KPISetEvent( m_hEnable );
  105. DWORD dwResult = KPIWaitForSingleObject( m_hRelocker, 3000 );
  106. if ( 0 == dwResult )
  107. {
  108. bRet = FALSE;
  109. }
  110. else if ( 1 == dwResult ) // The thread has ended.
  111. {
  112. m_hRelocker = NULL;
  113. bRet = TRUE;
  114. }
  115. else if ( 2 == dwResult ) // Time out.
  116. {
  117. if ( TRUE == KPITerminateThread( m_hRelocker, 0 ) )
  118. {
  119. m_hRelocker = NULL;
  120. bRet = TRUE;
  121. }
  122. else
  123. {
  124. bRet = FALSE;
  125. }
  126. }
  127. return bRet;
  128. }
  129. void S3PRelockAccount::Init()
  130. {
  131. m_hRelocker = NULL;
  132. m_param.dwCycle = m_dwCycle;
  133. m_param.hEnable = NULL;
  134. }