Changeset 495


Ignore:
Timestamp:
Mar 24, 2008, 3:59:07 AM (17 years ago)
Author:
NoWest
Message:

ThreadクラスをThreading名前空間に移動、及びThreadStateプロパティの実装。
1・整合性のためにgcを修正。
2・Abortの実装を検討中であるが対象スレッドに例外を発生させるメカニズムが
まだ、よく分からないうちに弄るのは危険と判断。もう少し動作を追ってからにする

Location:
trunk/Include
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Include/Classes/System/Threading/Thread.ab

    r493 r495  
    11'Thread.ab
    22
    3 '--------------------------------------------------------------------
    4 ' スレッドの優先順位
    5 '--------------------------------------------------------------------
     3NameSpace System
     4
     5/*タイプ*/
     6TypeDef LocalDataStoreSlot = Long
     7
     8
     9NameSpace Threading
     10
     11/*列挙体*/
    612Enum ThreadPriority
    713    Highest =      2
     
    1218End Enum
    1319
     20Enum 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
     41End Enum
     42
     43/*
     44デリゲート
     45*/
     46Delegate Sub ThreadStart()
     47
     48
     49/*
     50関数ポインタ
     51*/
    1452TypeDef PTHREAD_START_ROUTINE = *Function(args As VoidPtr) As DWord
    1553
    1654
    17 '--------------------------------------------------------------------
    18 ' スレッド クラス
    19 '--------------------------------------------------------------------
     55/*
     56クラス
     57*/
    2058Class Thread
    2159    m_hThread As HANDLE
     
    2462
    2563    m_fp As PTHREAD_START_ROUTINE
     64    m_dg As ThreadStart
    2665    m_args As VoidPtr
    2766    name As String
     67    state As ThreadState
    2868
    2969    isThrowing As Boolean
     
    4282
    4383        name = "sub thread"
     84        state = ThreadState.Unstarted
    4485
    4586        isThrowing = False
     
    5596
    5697        name = "sub thread"
     98        state = ThreadState.Unstarted
    5799
    58100        isThrowing = False
     
    68110
    69111        name = "sub thread"
     112        state = ThreadState.Unstarted
    70113
    71114        isThrowing = False
     
    78121
    79122        name = "sub thread"
     123        state = ThreadState.Unstarted
    80124
    81125        isThrowing = False
     
    86130    End Sub
    87131
    88 
    89132    Function Equals(thread As Thread) As Boolean
    90133        Return m_dwThreadId = thread.m_dwThreadId
    91134    End Function
    92135
    93     '-----------------------
    94     ' Public Properties
    95     '-----------------------
     136Public 'public property
    96137    Function IsAlive() As Boolean
    97138        Dim code As DWord
     
    118159    End Function
    119160
     161    Function ThreadState() As System.Threading.ThreadState
     162        Return This.state
     163    End Function
     164
    120165    Function Name() As String
    121166        Return name
     
    124169        This.name = name
    125170    End Sub
     171
     172Public 'public method
     173/*  Sub Abort()
     174        TODO '実装のためにはかなり検討が必要
     175        'This.__Throw(New ThreadAbortException)
     176    End Sub*/
    126177
    127178    Sub Start()
     
    129180        m_hThread=_beginthreadex(NULL,0,AddressOf(_run),VarPtr(This),CREATE_SUSPENDED,m_dwThreadId)
    130181        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
    171185    Virtual Function Run() As Long
    172186        If m_fp Then
     
    176190
    177191    Sub Suspend()
     192        This.state = ThreadState.SuspendRequested
    178193        If SuspendThread(m_hThread) = &HFFFFFFFF Then
    179             debug
     194            This.state = ThreadState.Unstarted
     195            Debug 'Throw New ThreadStateException
    180196        End If
     197        This.state = ThreadState.Suspended
    181198    End Sub
    182199    Sub Resume()
    183200        If ResumeThread(m_hThread) = &HFFFFFFFF Then
    184             debug
     201            state = ThreadState.Unstarted
     202            Debug 'Throw New ThreadStateException
    185203        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    /*------------------------ クラス内部用 --------------------------*/
     217Private
     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    /*------------------------ システム用 --------------------------*/
     254Public
    188255    Function __GetContext(ByRef Context As CONTEXT) As BOOL
    189256        Return GetThreadContext(m_hThread,Context)
     
    222289        countOfNeedFreeStructurePointers = 0
    223290    End Sub
    224 
    225 
    226     Static Function CurrentThread() As Thread
    227         Return _System_pobj_AllThreads->CurrentThread()
    228     End Function
    229291End Class
    230292
    231 Dim _System_pobj_AllThreads As *Detail._System_CThreadCollection
    232293
    233294Namespace Detail
     
    422483
    423484End Namespace 'Detail
    424 
     485End NameSpace 'Threading
     486End NameSpace 'System
     487
     488
     489/* システムが使う変数 */
     490Dim _System_pobj_AllThreads As *System.Threading.Detail._System_CThreadCollection
     491
     492/* システムが呼び出す関数 */
    425493Sub _System_AddNeedFreeTempStructure( structurePointer As VoidPtr )
    426     Thread.CurrentThread.__AddNeedFreeTempStructure( structurePointer )
     494    System.Threading.Thread.CurrentThread.__AddNeedFreeTempStructure( structurePointer )
    427495End Sub
    428496Sub _System_FreeTempStructure()
    429     Thread.CurrentThread.__FreeTempStructure()
     497    System.Threading.Thread.CurrentThread.__FreeTempStructure()
    430498End Sub
  • trunk/Include/system/gc.sbp

    r490 r495  
    156156
    157157        ' スレッド管理用オブジェクトを生成
    158         _System_pobj_AllThreads = New Detail._System_CThreadCollection()
     158        _System_pobj_AllThreads = New System.Threading.Detail._System_CThreadCollection()
    159159
    160160        ' 自身のThreadオブジェクトを生成
    161         Dim thread = New Thread(hTargetThread, GetCurrentThreadId(), 0)
     161        Dim thread = New System.Threading.Thread(hTargetThread, GetCurrentThreadId(), 0)
    162162        thread.Name = "main"
    163163
Note: See TracChangeset for help on using the changeset viewer.