Changeset 495
- Timestamp:
- Mar 24, 2008, 3:59:07 AM (17 years ago)
- Location:
- trunk/Include
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Include/Classes/System/Threading/Thread.ab
r493 r495 1 1 'Thread.ab 2 2 3 '-------------------------------------------------------------------- 4 ' スレッドの優先順位 5 '-------------------------------------------------------------------- 3 NameSpace System 4 5 /*タイプ*/ 6 TypeDef LocalDataStoreSlot = Long 7 8 9 NameSpace Threading 10 11 /*列挙体*/ 6 12 Enum ThreadPriority 7 13 Highest = 2 … … 12 18 End Enum 13 19 20 Enum ThreadState 21 'スレッド状態に AbortRequested が含まれ、そのスレッドは停止していますが、状態はまだ Stopped に変わっていません。 22 Aborted 23 'スレッド上で Thread.Abort メソッドを呼び出しますが、そのスレッドの終了を試みる保留中の System.Threading.ThreadAbortException をスレッドが受け取っていません。 24 AbortRequested 25 'スレッドは、フォアグラウンド スレッドではなく、バックグランド スレッドとして実行します。この状態は、Thread.IsBackground プロパティを設定して制御されます。 26 Background 27 'スレッドをブロックせずに起動します。保留中の ThreadAbortException もありません。 28 Running 29 'スレッドを停止します。 30 Stopped 31 'スレッドの停止を要求します。これは、内部でだけ使用します。 32 StopRequested 33 'スレッドを中断します。 34 Suspended 35 'スレッドの中断を要求します。 36 SuspendRequested 37 'スレッド上に Thread.Start メソッドを呼び出しません。 38 Unstarted 39 'スレッドがブロックされています。これは、Thread.Sleep または Thread.Join の呼び出し、ロックの要求 (たとえば、Monitor.Enter や Monitor.Wait の呼び出しによる)、または ManualResetEvent などのスレッド同期オブジェクトの待機の結果である可能性があります。 40 WaitSleepJoin 41 End Enum 42 43 /* 44 デリゲート 45 */ 46 Delegate Sub ThreadStart() 47 48 49 /* 50 関数ポインタ 51 */ 14 52 TypeDef PTHREAD_START_ROUTINE = *Function(args As VoidPtr) As DWord 15 53 16 54 17 '-------------------------------------------------------------------- 18 ' スレッドクラス19 '-------------------------------------------------------------------- 55 /* 56 クラス 57 */ 20 58 Class Thread 21 59 m_hThread As HANDLE … … 24 62 25 63 m_fp As PTHREAD_START_ROUTINE 64 m_dg As ThreadStart 26 65 m_args As VoidPtr 27 66 name As String 67 state As ThreadState 28 68 29 69 isThrowing As Boolean … … 42 82 43 83 name = "sub thread" 84 state = ThreadState.Unstarted 44 85 45 86 isThrowing = False … … 55 96 56 97 name = "sub thread" 98 state = ThreadState.Unstarted 57 99 58 100 isThrowing = False … … 68 110 69 111 name = "sub thread" 112 state = ThreadState.Unstarted 70 113 71 114 isThrowing = False … … 78 121 79 122 name = "sub thread" 123 state = ThreadState.Unstarted 80 124 81 125 isThrowing = False … … 86 130 End Sub 87 131 88 89 132 Function Equals(thread As Thread) As Boolean 90 133 Return m_dwThreadId = thread.m_dwThreadId 91 134 End Function 92 135 93 '----------------------- 94 ' Public Properties 95 '----------------------- 136 Public 'public property 96 137 Function IsAlive() As Boolean 97 138 Dim code As DWord … … 118 159 End Function 119 160 161 Function ThreadState() As System.Threading.ThreadState 162 Return This.state 163 End Function 164 120 165 Function Name() As String 121 166 Return name … … 124 169 This.name = name 125 170 End Sub 171 172 Public 'public method 173 /* Sub Abort() 174 TODO '実装のためにはかなり検討が必要 175 'This.__Throw(New ThreadAbortException) 176 End Sub*/ 126 177 127 178 Sub Start() … … 129 180 m_hThread=_beginthreadex(NULL,0,AddressOf(_run),VarPtr(This),CREATE_SUSPENDED,m_dwThreadId) 130 181 SetThreadPriority(m_hThread,m_Priority) 131 Resume() 132 End Sub 133 134 Private 135 Function Cdecl _run() As Long 136 '------------ 137 ' 前処理 138 '------------ 139 140 ' 構造体の一時メモリ退避用領域を作成 141 needFreeStructurePointers = _System_malloc( 1 ) 142 countOfNeedFreeStructurePointers = 0 143 144 'GCにスレッド開始を通知 145 _System_pobj_AllThreads->BeginThread(This, _System_GetSp() As *LONG_PTR) 146 147 148 '------------ 149 '実行 150 '------------ 151 _run=Run() 152 153 154 '------------ 155 '後処理 156 '------------ 157 158 'GCにスレッド終了を通知 159 _System_pobj_AllThreads->EndThread(This) 160 161 ' 構造体の一時メモリ退避用領域を破棄 162 _System_free( needFreeStructurePointers ) 163 164 '自身のスレッドハンドルを閉じる 165 CloseHandle(InterlockedExchangePointer(VarPtr(m_hThread),NULL)) 166 m_hThread=0 167 168 End Function 169 170 Public 182 This.Resume() 183 End Sub 184 171 185 Virtual Function Run() As Long 172 186 If m_fp Then … … 176 190 177 191 Sub Suspend() 192 This.state = ThreadState.SuspendRequested 178 193 If SuspendThread(m_hThread) = &HFFFFFFFF Then 179 debug 194 This.state = ThreadState.Unstarted 195 Debug 'Throw New ThreadStateException 180 196 End If 197 This.state = ThreadState.Suspended 181 198 End Sub 182 199 Sub Resume() 183 200 If ResumeThread(m_hThread) = &HFFFFFFFF Then 184 debug 201 state = ThreadState.Unstarted 202 Debug 'Throw New ThreadStateException 185 203 End If 186 End Sub 187 204 This.state = ThreadState.Running 205 End Sub 206 207 /* Function GetData(LocalDataStoreSlot) 208 End Function 209 Sub SetData(LocalDataStoreSlot) 210 End Sub*/ 211 212 Static Function CurrentThread() As Thread 213 Return _System_pobj_AllThreads->CurrentThread() 214 End Function 215 216 /*------------------------ クラス内部用 --------------------------*/ 217 Private 218 Function Cdecl _run() As Long 219 '------------ 220 ' 前処理 221 '------------ 222 223 ' 構造体の一時メモリ退避用領域を作成 224 needFreeStructurePointers = _System_malloc( 1 ) 225 countOfNeedFreeStructurePointers = 0 226 227 'GCにスレッド開始を通知 228 _System_pobj_AllThreads->BeginThread(This, _System_GetSp() As *LONG_PTR) 229 230 231 '------------ 232 '実行 233 '------------ 234 _run=Run() 235 236 237 '------------ 238 '後処理 239 '------------ 240 241 'GCにスレッド終了を通知 242 _System_pobj_AllThreads->EndThread(This) 243 244 ' 構造体の一時メモリ退避用領域を破棄 245 _System_free( needFreeStructurePointers ) 246 247 '自身のスレッドハンドルを閉じる 248 CloseHandle(InterlockedExchangePointer(VarPtr(m_hThread),NULL)) 249 m_hThread=0 250 251 End Function 252 253 /*------------------------ システム用 --------------------------*/ 254 Public 188 255 Function __GetContext(ByRef Context As CONTEXT) As BOOL 189 256 Return GetThreadContext(m_hThread,Context) … … 222 289 countOfNeedFreeStructurePointers = 0 223 290 End Sub 224 225 226 Static Function CurrentThread() As Thread227 Return _System_pobj_AllThreads->CurrentThread()228 End Function229 291 End Class 230 292 231 Dim _System_pobj_AllThreads As *Detail._System_CThreadCollection232 293 233 294 Namespace Detail … … 422 483 423 484 End Namespace 'Detail 424 485 End NameSpace 'Threading 486 End NameSpace 'System 487 488 489 /* システムが使う変数 */ 490 Dim _System_pobj_AllThreads As *System.Threading.Detail._System_CThreadCollection 491 492 /* システムが呼び出す関数 */ 425 493 Sub _System_AddNeedFreeTempStructure( structurePointer As VoidPtr ) 426 Thread.CurrentThread.__AddNeedFreeTempStructure( structurePointer )494 System.Threading.Thread.CurrentThread.__AddNeedFreeTempStructure( structurePointer ) 427 495 End Sub 428 496 Sub _System_FreeTempStructure() 429 Thread.CurrentThread.__FreeTempStructure()497 System.Threading.Thread.CurrentThread.__FreeTempStructure() 430 498 End Sub -
trunk/Include/system/gc.sbp
r490 r495 156 156 157 157 ' スレッド管理用オブジェクトを生成 158 _System_pobj_AllThreads = New Detail._System_CThreadCollection()158 _System_pobj_AllThreads = New System.Threading.Detail._System_CThreadCollection() 159 159 160 160 ' 自身のThreadオブジェクトを生成 161 Dim thread = New Thread(hTargetThread, GetCurrentThreadId(), 0)161 Dim thread = New System.Threading.Thread(hTargetThread, GetCurrentThreadId(), 0) 162 162 thread.Name = "main" 163 163
Note:
See TracChangeset
for help on using the changeset viewer.