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

模拟服务器

开发平台:

C/C++

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