TSWnd.cpp
上传用户:nameszq
上传日期:2014-08-12
资源大小:336k
文件大小:3k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // TSWnd.cpp: implementation of the CTSWnd class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "TSWnd.h"
  6. #include "TSCache.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CTSWnd & CTSWnd::GetInstance( )
  16. {
  17. static CTSWnd s_wndmsg;
  18. return s_wndmsg;
  19. }
  20. CTSWnd::CTSWnd()
  21. {
  22. CTSWnd::GetInstance().StartDispatchThread();
  23. }
  24. CTSWnd::~CTSWnd()
  25. {
  26. }
  27. int CTSWnd::AddWnd( HWND hWnd, UINT nMsg )
  28. {
  29. CSingleLock lock( &m_mutex, TRUE );
  30. TSWND_MSG wndmsg;
  31. wndmsg.hWnd = hWnd;
  32. wndmsg.nMsg = nMsg;
  33. return m_aWndMsg.Add( wndmsg );
  34. }
  35. void CTSWnd::RemoveWnd( HWND hWnd )
  36. {
  37. CSingleLock lock( &m_mutex, TRUE );
  38. for( int i=m_aWndMsg.GetSize()-1; i>=0; i-- )
  39. {
  40. if( m_aWndMsg.ElementAt(i).hWnd == hWnd )
  41. m_aWndMsg.RemoveAt(i);
  42. }
  43. }
  44. void CTSWnd::SendMessage( WPARAM wParam, LPARAM lParam )
  45. {
  46. CTSWndMsgArray aWndMsgTemp;
  47. {
  48. CSingleLock lock( &m_mutex, TRUE );
  49. aWndMsgTemp.SetSize( m_aWndMsg.GetSize() );
  50. for( int i=0; i<m_aWndMsg.GetSize(); i++ )
  51. aWndMsgTemp.SetAt( i, m_aWndMsg.ElementAt(i) );
  52. }
  53. for( int i=0; i<aWndMsgTemp.GetSize(); i++ )
  54. {
  55. ::SendMessage( aWndMsgTemp.ElementAt(i).hWnd, aWndMsgTemp.ElementAt(i).nMsg,
  56. wParam, lParam );
  57. }
  58. }
  59. BOOL CTSWnd::IsEmpty()
  60. {
  61. CSingleLock lock( &m_mutex, TRUE );
  62. return 0 == m_aWndMsg.GetSize();
  63. }
  64. HANDLE CTSWnd::m_hEventKillDispatchThread = NULL;
  65. HANDLE CTSWnd::m_hEventDispatchThreadKilled = NULL;
  66. // 分发接收数据的线程
  67. UINT TSDispatchThreadMain( LPVOID pParam )
  68. {
  69. while( TRUE )
  70. {
  71. UINT nMsgType = 0;
  72. PRCV_DATA pRCV_DATA = NULL;
  73. if( CTSCache::GetInstance().PopPacket( nMsgType, pRCV_DATA ) )
  74. {
  75. ASSERT( pRCV_DATA && pRCV_DATA->m_pData );
  76. if( pRCV_DATA && pRCV_DATA->m_pData )
  77. CTSWnd::GetInstance().SendMessage( nMsgType, (LPARAM)pRCV_DATA );
  78. CTSCache::GetInstance().FreePacket( pRCV_DATA );
  79. }
  80. Sleep( 1000 );
  81. // User wants to quit program
  82. if(WAIT_OBJECT_0 == WaitForSingleObject(CTSWnd::m_hEventKillDispatchThread,0) )
  83. {
  84. SetEvent(CTSWnd::m_hEventDispatchThreadKilled);
  85. AfxEndThread( 0, TRUE );
  86. return 0;
  87. }
  88. }
  89. }
  90. void CTSWnd::StartDispatchThread( )
  91. {
  92. m_hEventKillDispatchThread = CreateEvent(NULL,FALSE,FALSE,NULL);
  93. m_hEventDispatchThreadKilled = CreateEvent(NULL,FALSE,FALSE,NULL);
  94. AfxBeginThread( TSDispatchThreadMain, NULL, THREAD_PRIORITY_NORMAL );
  95. }
  96. void CTSWnd::StopDispatchThread( )
  97. {
  98. /* Do not call this function. it does not work well. */
  99. ASSERT( FALSE );
  100. /*
  101. // These codes do not work well. system will terminate the thread auto, but cause some memory leaks
  102. if( m_hEventKillDispatchThread )
  103. SetEvent(m_hEventKillDispatchThread);
  104. if(WAIT_OBJECT_0 == WaitForSingleObject(m_hEventKillDispatchThread,2000) )
  105. {
  106. if( m_hEventKillDispatchThread )
  107. CloseHandle(m_hEventKillDispatchThread);
  108. if( m_hEventDispatchThreadKilled )
  109. CloseHandle(m_hEventDispatchThreadKilled);
  110. m_hEventKillDispatchThread = NULL;
  111. m_hEventDispatchThreadKilled = NULL;
  112. }
  113. */
  114. }