歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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

MyEvent.h

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