source: trunk/ab5.0/ablib/src/Classes/System/Threading/Timer.ab@ 678

Last change on this file since 678 was 678, checked in by NoWest, 15 years ago

Forms.TimerクラスをThreading名前空間に引っ越す。
ついでにTimeoutのバグを修正

File size: 3.5 KB
Line 
1/*
2@brief タイマ
3*/
4
5Namespace System
6Namespace Threading
7
8Delegate Sub TimerCallback ( state As Object )
9
10Class Timer
11 Sub _Initialize( callback As TimerCallback, state As Object, dueTime As Int64, period As Int64 )
12 timeGetDevCaps(tc,SizeOf(TIMECAPS))
13 This.state = state
14 This.callback = callback
15 This._Change(dueTime,period)
16 End Sub
17
18 Sub _Change(dueTime As Int64, period As Int64 )
19 If This.id Then
20 timeKillEvent(This.id)
21 This.id = 0
22 End If
23 Select Case dueTime As Long
24 Case 0
25 'ノータイムで開始
26 Detail.TimerProc_Impl(This.id,0,ObjPtr(This) As ULONG_PTR,0,0)
27 Case -1
28 'タイマーは開始されない
29 Exit Sub
30 Case Else
31 'ディレイ後に開始
32 This.id = timeSetEvent(dueTime As DWord,tc.wPeriodMin,AddressOf(Detail.TimerProc_Impl),ObjPtr(This) As ULONG_PTR,TIME_ONESHOT or TIME_CALLBACK_FUNCTION)
33 End Select
34
35 This.dueTime = dueTime
36 This.period = period
37 End Sub
38
39Public
40 'Timer クラスの新しいインスタンスを初期化します。
41 Sub Timer ( callback As TimerCallback, state As Object, dueTime As Long, period As Long )
42 This._Initialize(callback,state,dueTime As Int64,period As Int64)
43 End Sub
44 Sub Timer ( callback As TimerCallback, state As Object, dueTime As Int64, period As Int64 )
45 This._Initialize(callback,state,dueTime As Int64,period As Int64)
46 End Sub
47 Sub Timer ( callback As TimerCallback, state As Object, dueTime As TimeSpan, period As TimeSpan )
48 This._Initialize(callback,state,dueTime.Ticks As Int64,period.Ticks As Int64)
49 End Sub
50 Sub Timer ( callback As TimerCallback, state As Object, dueTime As DWord, period As DWord )
51 This._Initialize(callback,state,dueTime As Int64,period As Int64)
52 End Sub
53 Sub Timer ( callback As TimerCallback )
54 This._Initialize(callback,Nothing,Timeout.Infinite As Int64,Timeout.Infinite As Int64)
55 End Sub
56
57 'オーバーロードされます。
58 Sub Dispose()
59 timeKillEvent(This.id)
60 End Sub
61
62 'タイマの開始時刻とメソッドの呼び出しの間隔を変更
63 Function Change ( dueTime As Long, period As Long ) As Boolean
64 This._Change(dueTime As Int64,period As Int64)
65 End Function
66 Function Change ( dueTime As Int64, period As Int64 ) As Boolean
67 This._Change(dueTime As Int64,period As Int64)
68 End Function
69 Function Change ( dueTime As TimeSpan, period As TimeSpan ) As Boolean
70 This._Change(dueTime.Ticks As Int64,period.Ticks As Int64)
71 End Function
72 Function Change ( dueTime As DWord, period As DWord ) As Boolean
73 This._Change(dueTime As Int64,period As Int64)
74 End Function
75
76Protected
77 callback As TimerCallback
78 state As Object
79 dueTime As Int64
80 period As Int64
81 id As MMRESULT
82 tc As TIMECAPS
83
84End Class
85
86
87Namespace Detail
88 Class Timer_Impl
89 Inherits System.Threading.Timer
90 Public
91 Sub Callback()
92 If Not IsNothing(callback) Then
93 callback(This.state)
94 End If
95
96 '一回だけ実行
97 If (period As Long) = -1 Then
98 'ここで終了
99 If id Then
100 timeKillEvent(This.id)
101 This.id = 0
102 Exit Sub
103 End If
104
105 '周期的に実行
106 Else
107 'ディレイ後に開始された
108 If dueTime As Long Then
109 timeKillEvent(This.id)
110 This.id = timeSetEvent(This.period As DWord,tc.wPeriodMin,AddressOf(Detail.TimerProc_Impl),ObjPtr(This) As ULONG_PTR,TIME_PERIODIC or TIME_CALLBACK_FUNCTION)
111 This.dueTime =0
112 End If
113 End If
114 End Sub
115 End Class
116 Sub TimerProc_Impl(uID As DWord, uMsg As DWord, dwUser As DWORD_PTR, dw1 As DWORD_PTR, dw2 As DWORD_PTR)
117 Dim obj As Timer_Impl
118 obj = dwUser As Timer_Impl
119 obj.Callback()
120 End Sub
121End Namespace
122
123End Namespace
124End Namespace
Note: See TracBrowser for help on using the repository browser.