From c88a85428e2e08e555f2baa22ca853edd1e03e79 Mon Sep 17 00:00:00 2001 From: Maurilio Longo Date: Tue, 23 Feb 2010 13:29:29 +0000 Subject: [PATCH] 2010-02-23 14:25 UTC+0100 Maurilio Longo (maurilio.longo@libero.it) * source/contrib/hbxpp/tthreadx.prg * changed ::start() method to execute ::atStart/::atEnd methods/codeblocks when present. * changed ::threadID() from method to iVar ! ::startCount should be incremented at every execution * ::threadSelf() method moved to HIDDEN section --- harbour/ChangeLog | 9 +++ harbour/contrib/hbxpp/tthreadx.prg | 92 ++++++++++++++++++------------ 2 files changed, 65 insertions(+), 36 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index f29a94ec8c..b8738baa6c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,15 @@ past entries belonging to author(s): Viktor Szakats. */ + +2010-02-23 14:25 UTC+0100 Maurilio Longo (maurilio.longo@libero.it) + * source/contrib/hbxpp/tthreadx.prg + * changed ::start() method to execute ::atStart/::atEnd methods/codeblocks + when present. + * changed ::threadID() from method to iVar + ! ::startCount should be incremented at every execution + * ::threadSelf() method moved to HIDDEN section + 2010-02-23 10:12 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * src/vm/estack.c * src/vm/fm.c diff --git a/harbour/contrib/hbxpp/tthreadx.prg b/harbour/contrib/hbxpp/tthreadx.prg index ece9b7ee5b..7b7de7fd84 100644 --- a/harbour/contrib/hbxpp/tthreadx.prg +++ b/harbour/contrib/hbxpp/tthreadx.prg @@ -98,16 +98,17 @@ METHOD signal() CLASS TSIGNAL CREATE CLASS TThread FUNCTION Thread EXPORTED: + VAR active AS LOGICAL READONLY INIT .F. + VAR atEnd AS USUAL INIT NIL + VAR atStart AS USUAL INIT NIL VAR cargo AS USUAL - VAR active AS LOGICAL READONLY INIT .f. VAR deltaTime AS NUMERIC READONLY INIT 0 VAR interval AS USUAL READONLY INIT NIL VAR priority AS NUMERIC READONLY INIT 0 + VAR result AS USUAL INIT NIL VAR startCount AS NUMERIC READONLY INIT 0 VAR startTime AS USUAL READONLY INIT NIL - VAR atEnd AS USUAL INIT NIL - VAR atStart AS USUAL INIT NIL - VAR result AS USUAL INIT NIL + VAR threadID AS NUMERIC READONLY INIT 0 PROTECTED: VAR maxStackSize AS USUAL INIT 50000 @@ -130,11 +131,12 @@ EXPORTED: METHOD setStartTime( nSeconds ) METHOD start( xAction, ... ) METHOD synchronize( nTimeOut ) - METHOD threadSelf() - METHOD threadID() METHOD thread INLINE ::TThread() +HIDDEN: + METHOD threadSelf() + ENDCLASS METHOD new( ... ) CLASS TTHREAD @@ -194,55 +196,71 @@ METHOD setStartTime( nSeconds ) CLASS TTHREAD RETURN .F. METHOD start( xAction, ... ) CLASS TTHREAD + /* TODO: thread stack size set by user ::maxStackSize */ IF ::active RETURN .F. - ELSEIF xAction == NIL + + ELSEIF ! Empty( xAction ) .OR. __ClsMsgType( Self:ClassH(), "EXECUTE" ) == HB_OO_MSG_METHOD ::pThreadID := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, ; { |...| - WHILE .T. + ::active := .T. + + IF __ClsMsgType( Self:ClassH(), "ATSTART" ) == HB_OO_MSG_METHOD + ::atStart( ... ) + ENDIF + + IF __ClsMsgType( Self:ClassH(), "_ATSTART" ) == HB_OO_MSG_DATA .AND.; + ValType( ::_atStart ) == "B" + + EVAL( ::_atStart, ... ) + ENDIF + + WHILE ::active + ::startTime := Seconds() - ::active := .T. + ::startCount++ ThreadObject( Self ) - ::result := ::execute( ... ) - ::startTime := NIL - ::active := .F. + + IF ! Empty( xAction ) .AND. ValType( xAction ) $ "CBS" + ::result := DO( xAction, ... ) + ELSE + ::result := ::execute( ... ) + ENDIF + IF ISNUMBER( ::interval ) + ::active := .F. hb_idleSleep( ::interval / 100 ) + ::active := .T. LOOP ENDIF - EXIT - ENDDO - RETURN NIL - }, ... ) - ELSEIF !Empty( xAction ) .AND. ValType( xAction ) $ "CBS" - ::pThreadID := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, ; - { |...| - WHILE .T. - ::startTime := Seconds() - ::active := .T. - ThreadObject( Self ) - IF ::atStart != NIL - EVAL( ::atStart, ... ) - ENDIF - ::result := DO( xAction, ... ) - IF ::atEnd != NIL - EVAL( ::atEnd, ... ) - ENDIF ::startTime := NIL - ::active := .F. - IF ISNUMBER( ::interval ) - hb_idleSleep( ::interval / 100 ) - LOOP + + IF __ClsMsgType( Self:ClassH(), "ATEND" ) == HB_OO_MSG_METHOD + ::atEnd( ... ) ENDIF - EXIT + + IF __ClsMsgType( Self:ClassH(), "_ATEND" ) == HB_OO_MSG_DATA .AND.; + ValType( ::_atEnd ) == "B" + + EVAL( ::_atEnd, ... ) + ENDIF + + ::active := .F. + ENDDO + RETURN NIL }, ... ) + + ::threadID := IIF( ::pThreadID == NIL, 0, hb_threadID( ::pThreadID ) ) + ELSE RETURN .F. + ENDIF - RETURN .T. + +RETURN .T. METHOD synchronize( nTimeOut ) CLASS TTHREAD LOCAL pThreadID := ::pThreadID @@ -257,6 +275,8 @@ METHOD synchronize( nTimeOut ) CLASS TTHREAD METHOD threadSelf() CLASS TTHREAD RETURN ::pThreadID +/* METHOD threadID() CLASS TTHREAD LOCAL pThreadID := ::pThreadID RETURN IIF( pThreadID == NIL, 0, hb_threadID( pThreadID ) ) +*/