source: trunk/Include/Classes/System/Threading/WaitHandle.ab@ 494

Last change on this file since 494 was 494, checked in by NoWest, 16 years ago

#ifndef~#define~#endifを除去

File size: 4.3 KB
Line 
1' Classes/System/Threading/WaitHandle.ab
2
3Namespace System
4Namespace Threading
5
6Namespace Detail
7 TypeDef PFNSignalObjectAndWait = *Function(hObjectToSignal As HANDLE, hObjectToWaitOn As HANDLE, dwMilliseconds As DWord, bAlertable As DWord) As DWord
8End Namespace
9
10Class WaitHandle
11 Implements System.IDisposable
12Public
13 ' Properties
14' Const Function SafeWaitHandle() As SafeWaitHandle
15' Sub SafeWaitHandle(h As SafeWaitHandle)
16
17 Const Virtual Function Handle() As HANDLE
18 Return h
19 End Function
20
21 Virtual Sub Handle(newHandle As HANDLE)
22 h = newHandle
23 End Sub
24
25 ' Methods
26 Virtual Sub WaitHandle()
27 End Sub
28
29 Virtual Sub ~WaitHandle()
30 This.Dispose()
31 End Sub
32
33 Virtual Sub Close()
34 This.Dispose()
35 End Sub
36
37 Virtual Sub Dispose()
38 Dim hDisposing = InterlockedExchangePointer(h, 0)
39 If hDisposing <> 0 Then
40 CloseHandle(hDisposing)
41 End If
42 End Sub
43
44 Function WaitOne() As Boolean
45 Return WaitOne(INFINITE, FALSE)
46 End Function
47
48 Function WaitOne(millisecondsTimeout As Long, exitContext As Boolean) As Boolean
49 Return WaitHandle.AfterWait(WaitForSingleObject(h, millisecondsTimeout As DWord), 1)
50 End Function
51
52 Function WaitOne(timeout As System.TimeSpan, exitContext As Boolean) As Boolean
53 Return WaitHandle.AfterWait(WaitForSingleObject(h, timeout.TotalMilliseconds() As DWord), 1)
54 End Function
55
56 Static Function WaitAll(count As DWord, handles As *HANDLE) As Boolean
57 Return WaitAll(count, handles, INFINITE, FALSE)
58 End Function
59
60 Static Function WaitAll(count As DWord, handles As *HANDLE, millisecondsTimeout As Long, exitContext As Boolean) As Boolean
61 Return WaitHandle.AfterWait(WaitForMultipleObjects(count, handles, TRUE, millisecondsTimeout), count)
62 End Function
63
64 Static Function WaitAll(count As DWord, handles As *HANDLE, timeout As System.TimeSpan, exitContext As Boolean) As Boolean
65 Return WaitHandle.AfterWait(WaitForMultipleObjects(count, handles, TRUE, timeout.TotalMilliseconds() As DWord), count)
66 End Function
67
68 Static Function WaitAny(count As DWord, handles As *HANDLE) As Boolean
69 Return WaitAny(count, handles, INFINITE, FALSE)
70 End Function
71
72 Static Function WaitAny(count As DWord, handles As *HANDLE, millisecondsTimeout As Long, exitContext As Boolean) As Boolean
73 Return WaitHandle.AfterWait(WaitForMultipleObjects(count, handles, FALSE, millisecondsTimeout), count)
74 End Function
75
76 Static Function WaitAny(count As DWord, handles As *HANDLE, timeout As System.TimeSpan, exitContext As Boolean) As Boolean
77 Return WaitHandle.AfterWait(WaitForMultipleObjects(count, handles, FALSE, timeout.TotalMilliseconds() As DWord), count)
78 End Function
79
80 Static Function SignalAndWait(toSignal As WaitHandle, toWaitOn As WaitHandle) As Boolean
81 Return SignalAndWait(toSignal, toWaitOn, INFINITE, FALSE)
82 End Function
83
84 Static Function SignalAndWait (toSignal As WaitHandle, toWaitOn As WaitHandle, timeout As System.TimeSpan, exitContext As Boolean) As Boolean
85 Return SignalAndWait(toSignal, toWaitOn, timeout.TotalMilliseconds() As Long, FALSE)
86 End Function
87
88 Static Function SignalAndWait(toSignal As WaitHandle, toWaitOn As WaitHandle, millisecondsTimeout As Long, exitContext As Boolean) As Boolean
89 Dim pSignalObjectAndWait = GetProcAddress(GetModuleHandle("Kernel32.dll"), "SignalObjectAndWait") As Detail.PFNSignalObjectAndWait
90 If pSignalObjectAndWait = 0 Then
91 Throw New PlatformNotSupportedException("WaitHandle.SignalAndWait: This platform doesn't supoort this operation.")
92 End If
93 Return WaitHandle.AfterWait(pSignalObjectAndWait(toSignal.Handle, toWaitOn.Handle, millisecondsTimeout As DWord, FALSE), 1)
94 End Function
95
96Public
97 Function WaitTimeout() As Long
98 Return WAIT_TIMEOUT
99 End Function
100
101Protected
102 Static Const InvalidHandle = INVALID_HANDLE_VALUE As HANDLE
103
104Private
105 h As HANDLE
106
107 Static Function AfterWait(ret As DWord, n As DWord) As Boolean
108 Select Case ret
109 Case WAIT_TIMEOUT
110 Return False
111 Case WAIT_ABANDONED
112 ' Throw AbandonedMutexException
113 Debug
114 ExitThread(0)
115 'Case WAIT_FAILED
116 Case Else
117 If WAIT_OBJECT_0 <= ret And ret < WAIT_OBJECT_0 + n Then
118 Return True
119 End If
120 ' ObjectDisposedException?
121 Debug
122 ExitThread(0)
123 End Select
124 End Function
125End Class
126
127End Namespace 'Threading
128End Namespace 'System
Note: See TracBrowser for help on using the repository browser.