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

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "Thread.h"
  3. #include "Macro.h"
  4. #include <process.h> //Thread define
  5. #include "Win32Exception.h"
  6. /*
  7.  * namespace OnlineGameLib::Win32
  8.  */
  9. namespace OnlineGameLib {
  10. namespace Win32 {
  11. CThread::CThread()
  12. : m_hThread( NULL )
  13. {
  14. }
  15.       
  16. CThread::~CThread()
  17. {
  18. SAFE_CLOSEHANDLE( m_hThread );
  19. }
  20. HANDLE CThread::GetHandle() const
  21. {
  22. return m_hThread;
  23. }
  24. void CThread::Start()
  25. {
  26. if ( m_hThread == NULL )
  27. {
  28. unsigned int threadID = 0;
  29. m_hThread = (HANDLE)::_beginthreadex(0, 
  30. 0, 
  31. ThreadFunction,
  32. ( void * )this, 
  33. 0, 
  34. &threadID );
  35. if ( m_hThread == NULL )
  36. {
  37. throw CWin32Exception(_T("CThread::Start() - _beginthreadex"), GetLastError());
  38. }
  39. }
  40. else
  41. {
  42. throw CException(_T("CThread::Start()"), _T("Thread already running - you can only call Start() once!"));
  43. }
  44. }
  45. void CThread::Wait() const
  46. {
  47. if ( !Wait( INFINITE ) )
  48. {
  49. throw CException(_T("CThread::Wait()"), _T("Unexpected timeout on infinite wait"));
  50. }
  51. }
  52. bool CThread::Wait(DWORD timeoutMillis) const
  53. {
  54. bool ok;
  55. if ( !m_hThread )
  56. {
  57. return true;
  58. }
  59. DWORD result = ::WaitForSingleObject( m_hThread, timeoutMillis );
  60. if ( result == WAIT_TIMEOUT )
  61. {
  62. ok = false;
  63. }
  64. else if ( result == WAIT_OBJECT_0 )
  65. {
  66. ok = true;
  67. }
  68. else
  69. {
  70. throw CWin32Exception( _T( "CThread::Wait() - WaitForSingleObject" ), ::GetLastError() );
  71. }
  72.     
  73. return ok;
  74. }
  75. unsigned int __stdcall CThread::ThreadFunction( void *pV )
  76. {
  77. int result = 0;
  78. CThread* pThis = ( CThread * )pV;
  79.    
  80. if ( pThis )
  81. {
  82. try
  83. {
  84. result = pThis->Run();
  85. }
  86. catch( ... )
  87. {
  88. TRACE( "CThread::ThreadFunction exception!" );
  89. }
  90. }
  91. return result;
  92. }
  93. void CThread::Terminate( DWORD exitCode /* = 0 */ )
  94. {
  95. if ( m_hThread && !::TerminateThread( m_hThread, exitCode ) )
  96. {
  97. TRACE( "CThread::Terminate error!" );
  98. }
  99. SAFE_CLOSEHANDLE( m_hThread );
  100. }
  101. } // End of namespace OnlineGameLib
  102. } // End of namespace Win32