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 "StdAfx.h"
  9. #include "KThread.h"
  10. #include "process.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 = CreateEvent(NULL, TRUE, FALSE, NULL);
  31. }
  32. unsigned ID = 0;
  33. m_hProcessor = (HANDLE)_beginthreadex( NULL, 0, KThread::ThreadFun, (void *)this, 0, &ID );
  34. hRet = m_hProcessor;
  35. return hRet;
  36. }
  37. BOOL KThread::Stop()
  38. {
  39. BOOL bRet = FALSE;
  40. if (NULL == m_hProcessor
  41. || NULL == m_hStop)
  42. {
  43. bRet = TRUE;
  44. return bRet;
  45. }
  46. SetEvent(m_hStop);
  47. DWORD dwResult = WaitForSingleObject(m_hProcessor, INFINITE);
  48. if (WAIT_FAILED == dwResult)
  49. {
  50. bRet = FALSE;
  51. }
  52. else if (WAIT_OBJECT_0 == dwResult)
  53. {
  54. bRet = TRUE;
  55. }
  56. else if (WAIT_TIMEOUT == dwResult) // Time out.
  57. {
  58. if (TerminateThread(m_hProcessor, 0))
  59. {
  60. bRet = TRUE;
  61. }
  62. else
  63. {
  64. bRet = FALSE;
  65. }
  66. }
  67. if (bRet)
  68. {
  69. CloseHandle(m_hStop);
  70. m_hStop = NULL;
  71. CloseHandle(m_hProcessor);
  72. m_hProcessor = NULL;
  73. }
  74. return bRet;
  75. }
  76. BOOL KThread::IsAskingStop()
  77. {
  78. assert(m_hStop);
  79. return ::WaitForSingleObject(m_hStop, 0) != WAIT_TIMEOUT;
  80. }
  81. unsigned  __stdcall KThread::ThreadFun( void * lpParam )
  82. {
  83. try
  84. {
  85. KThread* pThis = (KThread*)lpParam;
  86. assert(pThis);
  87. try
  88. {
  89. if (!pThis)
  90. throw -1;
  91. return pThis->Main(lpParam);
  92. }
  93. catch (...)
  94. {//try Clearup
  95. if (NULL != pThis->m_hProcessor)
  96. {
  97. ::CloseHandle(pThis->m_hProcessor);
  98. pThis->m_hProcessor = NULL;
  99. }
  100. if (NULL != pThis->m_hStop)
  101. {
  102. ::CloseHandle(pThis->m_hStop);
  103. pThis->m_hStop = NULL;
  104. }
  105. return -1;
  106. }
  107. }
  108. catch (...)
  109. {//fatal
  110. return -1;
  111. }
  112. }