歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用C++實現Win32事件對象,同步線程

用C++實現Win32事件對象,同步線程

日期:2017/3/1 10:46:48   编辑:Linux編程
在Win32環境下編寫多線程應用程序,經常要用到事件對象Event,來進行線程同步。與其相關的一組API包括:CreateEvent,SetEvent,ResetEvent,WaitForSingleObject,和CloseHandle。關於這些API的功能以及參數意義等這裡就不多說了。下邊,我封裝了一個事件對象類,以及測試代碼。已由本人在VS2005環境下編譯,測試通過。

MyEvent.h

  1. #ifndef My_Event_Header
  2. #define My_Event_Header
  3. #include <iostream>
  4. #ifdef WIN32
  5. #include <Windows.h>
  6. #endif
  7. using namespace std;
  8. //---------------------------------------------------------------
  9. class CEventImpl
  10. {
  11. protected:
  12. /*
  13. 創建一個匿名事件對象
  14. `bAutoReset true 人工重置
  15. false 自動重置
  16. */
  17. CEventImpl(bool bManualReset);
  18. /*
  19. 銷毀一個事件對象
  20. */
  21. ~CEventImpl();
  22. /*
  23. 將當前事件對象設置為有信號狀態
  24. 若自動重置,則等待該事件對象的所有線程只有一個可被調度
  25. 若人工重置,則等待該事件對象的所有線程變為可被調度
  26. */
  27. void SetImpl();
  28. /*
  29. 以當前事件對象,阻塞線程,將其永遠掛起
  30. 直到事件對象被設置為有信號狀態
  31. */
  32. bool WaitImpl();
  33. /*
  34. 以當前事件對象,阻塞線程,將其掛起指定時間間隔
  35. 之後線程自動恢復可調度
  36. */
  37. bool WaitImpl(long lMilliseconds);
  38. /*
  39. 將當前事件對象設置為無信號狀態
  40. */
  41. void ResetImpl();
  42. private:
  43. HANDLE h_Event;
  44. };
  45. inline void CEventImpl::SetImpl()
  46. {
  47. if (!SetEvent(h_Event))
  48. {
  49. cout<<"cannot signal event"<<endl;
  50. }
  51. }
  52. inline void CEventImpl::ResetImpl()
  53. {
  54. if (!ResetEvent(h_Event))
  55. {
  56. cout<<"cannot reset event"<<endl;
  57. }
  58. }
  59. //---------------------------------------------------------------
  60. class CMyEvent: private CEventImpl
  61. {
  62. public:
  63. CMyEvent(bool bManualReset = true);
  64. ~CMyEvent();
  65. void Set();
  66. bool Wait();
  67. bool Wait(long milliseconds);
  68. bool TryWait(long milliseconds);
  69. void Reset();
  70. private:
  71. CMyEvent(const CMyEvent&);
  72. CMyEvent& operator = (const CMyEvent&);
  73. };
  74. inline void CMyEvent::Set()
  75. {
  76. SetImpl();
  77. }
  78. inline bool CMyEvent::Wait()
  79. {
  80. return WaitImpl();
  81. }
  82. inline bool CMyEvent::Wait(long milliseconds)
  83. {
  84. if (!WaitImpl(milliseconds))
  85. {
  86. cout<<"time out"<<endl;
  87. return false;
  88. }
  89. else
  90. {
  91. return true;
  92. }
  93. }
  94. inline bool CMyEvent::TryWait(long milliseconds)
  95. {
  96. return WaitImpl(milliseconds);
  97. }
  98. inline void CMyEvent::Reset()
  99. {
  100. ResetImpl();
  101. }
  102. #endif
Copyright © Linux教程網 All Rights Reserved