' Classes/System/Threading/EventWaitHandle.ab

NameSpace System
NameSpace Threading

Enum EventResetMode
	AutoReset = False
	ManualReset = True
End Enum

Class EventWaitHandle
	Inherits System.Threading.WaitHandle
Private
	Sub EventWaitHandle()
	End Sub
Public
	Sub EventWaitHandle (initialState As Boolean, mode As EventResetMode)
		This.Handle(CreateEvent(NULL,mode As BOOL,initialState As BOOL,NULL))
	End Sub
	Sub EventWaitHandle (initialState As Boolean, mode As EventResetMode, name As String)
		This.Handle(CreateEvent(NULL,mode As BOOL,initialState As BOOL,ToTCStr(name)))
	End Sub
	Sub EventWaitHandle (initialState As Boolean, mode As EventResetMode, name As String, ByRef createdNew As Boolean)
		This.Handle(CreateEvent(NULL,mode As BOOL,initialState As BOOL,ToTCStr(name)))
		If ERROR_ALREADY_EXISTS=GetLastError() Then createdNew=False Else createdNew=True
	End Sub
/*	Sub EventWaitHandle (initialState As Boolean, mode As EventResetMode, name As String, ByRef createdNew As Boolean, EventWaitHandleSecurity)
	TODO
	End Sub*/

/*
WaitHandle で保持されているすべてのリソースを解放します。
WaitHandleから継承
Virtual Sub Close()
End Sub
*/

/*CreateObjRef*/

/*
WaitHandleから継承
	Virtual Sub Dispose()
	End Sub
*/

/*Equals*/
/*Finalize*/
/*GetAccessControl*/
/*GetHashCode*/
/*GetLifetimeService*/
/*InitializeLifetimeService*/
/*MemberwiseClone*/


	/*
	既存の名前付き同期イベントを開きます。
	*/
	Static Function OpenExisting(name As String) As EventWaitHandle
		If ActiveBasic.IsNothing(name) Then
			Throw New ArgumentNullException("name")
		Else If name.Length = 0 Then
			Throw New ArgumentException("name")
		End If
		OpenExisting = New EventWaitHandle
		Dim h = OpenEvent(EVENT_ALL_ACCESS, FALSE, ToTCStr(name))
		If h = 0 Then
			IO.Detail.ThrowWinLastErrorIOException("OpenEvent failed.")
		End If
		OpenExisting.Handle = h
	End Function

	/*
	セキリティアクセスを指定して既存の名前付き同期イベントを開きます。
	*/
/*	Static Function OpenExisting(name As String, rights As EventWaitHandleRights) As WaitHandle
		TODO
	End Function*/

	/*
	イベントの状態を非シグナル状態に設定し、スレッドをブロックします。
	*/
	Function Reset() As Boolean
		If ResetEvent(This.Handle()) Then Return True
		Reset=False
	End Function


	/*
	イベントの状態をシグナル状態に設定し、待機している 1 つ以上のスレッドが進行できるようにします。
	*/
	Function Set() As Boolean
		If SetEvent(This.Handle()) Then Return True
		Set=False
	End Function

/*SetAccessControl*/
/*ToString*/

/*
WaitHandleから継承
WaitAll
WaitAny
WaitOne
*/

/*
WaitHandle から継承
Handle
SafeWaitHandle
*/

End Class

End Namespace
End Namespace
