BlackTDN :: Harbour CodeBlock
Observe o fragmento de código abaixo e deleite-se com uma das maravilhas da evolução da sintaxe xBase no Harbour: O CodeBlock é, de fato, um CodeBlock.
1: METHOD start( xAction, ... ) CLASS THREAD 2: 3: IF ::active 4: RETURN .F. 5: 6: ELSE 7: ::pThreadID := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, ; 8: {| ... | 9: LOCAL nTime 10: 11: ThreadObject( Self ) 12: 13: ::active := .T. 14: ::startCount++ 15: 16: IF HB_ISNUMERIC( ::startTime ) 17: nTime := ::startTime - Seconds() 18: IF nTime < 0 19: nTime += 86400 20: ENDIF 21: hb_idleSleep( nTime ) 22: ::startTime := NIL 23: ENDIF 24: 25: ::atStart( ... ) 26: IF HB_ISBLOCK( ::_atStart ) 27: Eval( ::_atStart, ... ) 28: ENDIF 29: 30: WHILE .T. 31: 32: nTime := hb_MilliSeconds() 33: 34: BEGIN SEQUENCE35: IF ! Empty( xAction ) .AND. ValType( xAction ) $ "CBS"
36: ::result := Do( xAction, ... ) 37: ELSE 38: ::result := ::execute( ... ) 39: ENDIF 40: ALWAYS 41: __QuitCancel() 42: ENDSEQUENCE 43: 44: nTime := Int( ( hb_MilliSeconds() - nTime ) / 10 ) 45: ::deltaTime := nTime 46: 47: /* TODO: when ::startTime is set execution is suspended
48: * but I do not know the exact conditions and how
49: * it can be resumed
50: */
51: 52: IF ! HB_ISNUMERIC( ::interval ) 53: EXIT 54: ENDIF 55: 56: nTime := ::interval - ::deltaTime 57: IF nTime > 0 58: hb_idleSleep( nTime / 100 ) 59: ENDIF 60: ::startCount++ 61: 62: ENDDO 63: 64: ::atEnd( ... ) 65: IF HB_ISBLOCK( ::_atEnd ) 66: Eval( ::_atEnd, ... ) 67: ENDIF 68: ::active := .F. 69: 70: RETURN NIL 71: }, ... ) 72: 73: ::threadID := IIF( ::pThreadID == NIL, 0, hb_threadID( ::pThreadID ) ) 74: 75: ENDIF 76: 77: RETURN .T.[]s
иαldσ dj
Comentários
Postar um comentário