1 #pragma once
2 
3 
4 namespace MT
5 {
6 	//
7 	//
8 	//
9 	class Event
10 	{
11 		::HANDLE eventHandle;
12 
13 	private:
14 
15 		Event(const Event&) {}
16 		void operator=(const Event&) {}
17 
18 	public:
19 
20 		Event()
21 		{
22 			static_assert(sizeof(Event) == sizeof(::HANDLE), "sizeof(Event) is invalid");
23 			eventHandle = NULL;
24 		}
25 
26 		Event(EventReset::Type resetType, bool initialState)
27 		{
28 			eventHandle = NULL;
29 			Create(resetType, initialState);
30 		}
31 
32 		~Event()
33 		{
34 			CloseHandle(eventHandle);
35 			eventHandle = NULL;
36 		}
37 
38 		void Create(EventReset::Type resetType, bool initialState)
39 		{
40 			if (eventHandle != NULL)
41 			{
42 				CloseHandle(eventHandle);
43 			}
44 
45 			BOOL bManualReset = (resetType == EventReset::AUTOMATIC) ? FALSE : TRUE;
46 			BOOL bInitialState = initialState ? TRUE : FALSE;
47 			eventHandle = ::CreateEvent(NULL, bManualReset, bInitialState, NULL);
48 		}
49 
50 		void Signal()
51 		{
52 			SetEvent(eventHandle);
53 		}
54 
55 		void Reset()
56 		{
57 			ResetEvent(eventHandle);
58 		}
59 
60 		bool Wait(uint32 milliseconds)
61 		{
62 			DWORD res = WaitForSingleObject(eventHandle, milliseconds);
63 			return (res == WAIT_OBJECT_0);
64 		}
65 
66 	};
67 
68 }
69 
70 
71