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

模拟服务器

开发平台:

C/C++

  1. // -------------------------------------------------------------------------
  2. // 文件名 : KThread.cpp
  3. // 创建者 : 万里
  4. // 创建时间 : 2003-5-1 21:15:58
  5. // 功能描述 :
  6. //
  7. // -------------------------------------------------------------------------
  8. #include "KStdAfx.h"
  9. #include "GlobalFun.h"
  10. #include "KThread.h"
  11. KThread::KThread()
  12. {
  13. m_hStop = NULL;
  14. m_hProcessor = NULL;
  15. }
  16. KThread::~KThread()
  17. {
  18. assert(m_hStop == NULL);
  19. assert(m_hProcessor == NULL);
  20. }
  21. HANDLE KThread::Start()
  22. {
  23. HANDLE hRet = NULL;
  24. if ( NULL != m_hProcessor ) // The thread has been running.
  25. {
  26. return hRet;
  27. }
  28. if (NULL == m_hStop)
  29. {
  30. m_hStop = KPICreateEvent(NULL, TRUE, FALSE, NULL);
  31. }
  32. m_hProcessor = KPICreateThread(KThread::ThreadFun, (LPVOID)this, NULL);
  33. hRet = m_hProcessor;
  34. return hRet;
  35. }
  36. BOOL KThread::Stop()
  37. {
  38. BOOL bRet = FALSE;
  39. if (NULL == m_hProcessor
  40. || NULL == m_hStop)
  41. {
  42. bRet = TRUE;
  43. return bRet;
  44. }
  45. KPISetEvent(m_hStop);
  46. DWORD dwResult = KPIWaitForSingleObject(m_hProcessor, INFINITE);
  47. if (0 == dwResult)
  48. {
  49. bRet = FALSE;
  50. }
  51. else if (1 == dwResult)
  52. {
  53. bRet = TRUE;
  54. }
  55. else if (2 == dwResult) // Time out.
  56. {
  57. if (KPITerminateThread(m_hProcessor, 0))
  58. {
  59. bRet = TRUE;
  60. }
  61. else
  62. {
  63. bRet = FALSE;
  64. }
  65. }
  66. if (bRet)
  67. {
  68. KPICloseHandle(m_hStop);
  69. m_hStop = NULL;
  70. KPICloseHandle(m_hProcessor);
  71. m_hProcessor = NULL;
  72. }
  73. return bRet;
  74. }
  75. DWORD WINAPI KThread::ThreadFun(LPVOID lpParam)
  76. {
  77. assert(lpParam);
  78. KThread* pThis = (KThread*)lpParam;
  79. return pThis->Main(lpParam);
  80. }
  81. K_CS::K_CS()
  82. {
  83. ::InitializeCriticalSection(&m_sect);
  84. m_bAcquired = FALSE;
  85. }
  86. K_CS::~K_CS()
  87. {
  88. Unlock();
  89. ::DeleteCriticalSection(&m_sect);
  90. }
  91. BOOL K_CS::Lock()
  92. {
  93. ::EnterCriticalSection(&m_sect);
  94. m_bAcquired = TRUE;
  95. return m_bAcquired;
  96. }
  97. BOOL K_CS::Unlock()
  98. {
  99. if (m_bAcquired)
  100. {
  101. ::LeaveCriticalSection(&m_sect);
  102. m_bAcquired = FALSE;
  103. }
  104. // successfully unlocking means it isn't acquired
  105. return !m_bAcquired;
  106. }