Thread.cpp
上传用户:glass0516
上传日期:2010-01-11
资源大小:104k
文件大小:5k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. * RelayFax Open Source Project
  3. * Copyright 1996-2004 Alt-N Technologies, Ltd.
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted only as authorized by the RelayFax Open 
  8. * Source License.  A copy of this license is available in file LICENSE 
  9. * in the top-level directory of the distribution.
  10. *
  11. * RelayFax is a registered trademark of Alt-N Technologies, Ltd.
  12. *
  13. * Individual files and/or contributed packages may be copyright by
  14. * other parties and subject to additional restrictions.
  15. *****************************************************************************/
  16. #include "stdafx.h"
  17. #include "Thread.h"
  18. #include "excepthandler.h"
  19. //////////////////////////////// Externals /////////////////////////////////////
  20. ////////////////////// Static Member Functions //////////////////////////
  21. // Static thread function calls member function, since _beginthreadex
  22. // can't call a member function directly, it passes the object pointer
  23. // to this static function
  24. unsigned int _stdcall CThread::ThreadFunc( void* pArg )
  25. {
  26. CThread* pThread = (CThread*) pArg;
  27. return pThread->Run();
  28. }
  29. //////////////////////////////////////////////////////////////////////
  30. // Construction/Destruction
  31. //////////////////////////////////////////////////////////////////////
  32. CThread::CThread( void )
  33. {
  34. // Initialize thread handle
  35. m_hThread = INVALID_HANDLE_VALUE;
  36. m_nWaitTimeout = INFINITE;
  37. }
  38. CThread::~CThread()
  39. {
  40. // Close all handles used by thread
  41. if ( m_hThread != INVALID_HANDLE_VALUE )
  42. CloseHandle( m_hThread );
  43. }
  44. /////////////////////////// Public member functions //////////////////
  45. // Thread startup
  46. // 
  47. DWORD CThread::StartThread( void )
  48. {
  49. m_dwLastTimeout = GetTickCount();
  50. // Create the thread
  51. m_hThread = (HANDLE)_beginthreadex( NULL, 0, CThread::ThreadFunc, 
  52.                                 this, 0, &m_nThreadID ); 
  53. if ( m_hThread == INVALID_HANDLE_VALUE )
  54. {
  55. // Error creating thread
  56. return -1;
  57. }
  58. // Success
  59. return 0;
  60. }
  61. unsigned int CThread::Run()
  62. {
  63. DWORD dwResult;
  64. bool bRun;
  65. __try
  66. {
  67. bRun = OnStartup();
  68. }
  69. __except ( ExceptionHandler( GetExceptionInformation(), m_sThreadName.c_str(), "OnStartup()" ) )
  70. {
  71. //LOG( LOG_SYSTEM, "%s: Unhandled exception in OnStartup()", m_sThreadName.c_str() );
  72. }
  73. while( bRun )
  74. {
  75. __try
  76. {
  77. dwResult = MsgWaitForMultipleObjects( m_handles.size(), &m_handles.at(0), FALSE, 
  78.   m_nWaitTimeout, QS_ALLINPUT );
  79. if( dwResult >= WAIT_OBJECT_0 && dwResult < WAIT_OBJECT_0 + m_handles.size() )
  80. {
  81. if( OnEvent( dwResult - WAIT_OBJECT_0 ) )
  82. {
  83. bRun = false;
  84. }
  85. }
  86. else if( dwResult == WAIT_OBJECT_0 + m_handles.size() )
  87. {
  88. MSG msg;
  89. while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
  90. {
  91. // process message
  92. if( OnMsg( &msg ) )
  93. {
  94. bRun = false;
  95. break;
  96. }
  97. }
  98. }
  99. else if( dwResult == WAIT_TIMEOUT )
  100. {
  101. OnWaitTimeout();
  102. m_dwLastTimeout = GetTickCount();
  103. }
  104. else
  105. {
  106. #ifdef _DEBUG
  107. char szMsg[80];
  108. wsprintf( szMsg, "MsgWaitForMultipleObjects returned %d LastError=%dn", 
  109.       dwResult, GetLastError() );
  110. OutputDebugString( szMsg );
  111. #endif
  112. bRun = false;
  113. }
  114. if( GetTickCount() - m_dwLastTimeout > m_nWaitTimeout )
  115. {
  116. OnWaitTimeout();
  117. m_dwLastTimeout = GetTickCount();
  118. }
  119. }
  120. __except ( ExceptionHandler( GetExceptionInformation(), m_sThreadName.c_str(), "Run()" ) )
  121. {
  122. //LOG( LOG_SYSTEM, "%s: Unhandled exception in Run()", m_sThreadName.c_str() );
  123. }
  124. }
  125. __try
  126. {
  127. OnShutdown();
  128. }
  129. __except ( ExceptionHandler( GetExceptionInformation(), m_sThreadName.c_str(), "OnShutdown()" ) )
  130. {
  131. //LOG( LOG_SYSTEM, "%s: Unhandled exception in OnShutdown()", m_sThreadName.c_str() );
  132. // throw;
  133. }
  134. return 0;
  135. }
  136. //////////////////////////////////////////////////////////////////////
  137. // One time initialization
  138. //////////////////////////////////////////////////////////////////////
  139. bool CThread::OnStartup( void )
  140. {
  141. return true;
  142. }
  143. //////////////////////////////////////////////////////////////////////
  144. // Uninitialize - called before thread exits
  145. //////////////////////////////////////////////////////////////////////
  146. void CThread::OnShutdown( void )
  147. {
  148. }
  149. //////////////////////////////////////////////////////////////////////
  150. // Handle message - return true if WM_QUIT received
  151. //////////////////////////////////////////////////////////////////////
  152. bool CThread::OnMsg( MSG* pMsg )
  153. {
  154. // handle message
  155. switch( pMsg->message )
  156. {
  157. case WM_QUIT:
  158. return true;
  159. default:
  160. TranslateMessage( pMsg );
  161. DispatchMessage( pMsg );
  162. return false;
  163. }
  164. }
  165. //////////////////////////////////////////////////////////////////////
  166. // Handle event being signalled - return true if Stop Event signaled
  167. //////////////////////////////////////////////////////////////////////
  168. bool CThread::OnEvent( int nIndex )
  169. {
  170. // handle message
  171. if( nIndex == 0 )
  172. return true;
  173. return false;
  174. }
  175. //////////////////////////////////////////////////////////////////////
  176. // Handle wait timeout - do periodic processing
  177. //////////////////////////////////////////////////////////////////////
  178. bool CThread::OnWaitTimeout( void )
  179. {
  180. return false;
  181. }