#include "hbmemory.ch"

FUNCTION MAIN
LOCAL nH1, nH2, nH3, nH4
LOCAL n:=0
LOCAL aSign:={"|", "/", "-", "\" }
LOCAL nPrev:=SECONDS()

  CLS
  ? "   Time:        Memory used:                          Miliseconds elapsed"
  ?
  ? "Can you see it ??? :) Press any key or wait 30 seconds"
  ?
  ?
  @ 10,2 SAY "Memory before TEST() call" + STR( MEMORY(HB_MEM_USED) )
  TEST()
  @ 11,2 SAY "Memory after TEST() and before collecting" + STR( MEMORY(HB_MEM_USED) )
  HB_GCALL()
  @ 12,2 SAY "Memory after collecting" + STR( MEMORY(HB_MEM_USED) )
  nH1 := HB_IDLEADD( {|| DEVPOS(0,01), DEVOUT( TIME() ) } )
  nH2 := HB_IDLEADD( {|| DEVPOS(0,21), TEST(), DEVOUT( MEMORY(HB_MEM_USED) ) } )
  nH3 := HB_IDLEADD( {|| DEVPOS(0,41), IIF(n==4,n:=1,n++),DEVOUT(aSign[n]) } )
  nH4 := HB_IDLEADD( {|| DEVPOS(0,61), DEVOUT( 1000*(SECONDS()-nPrev) ), nPrev:=SECONDS() } )

  ? VALTYPE(nH1), nH1, VALTYPE(nH2), nH2, VALTYPE(nH3), nH3, VALTYPE(nH4), nH4
  
  INKEY( 30 )
  IF !EMPTY(nH3)
     @ 14,2 SAY "Delete task 3: " + HB_VALTOSTR(nH3)
     HB_IDLEDEL( nH3 )
  ENDIF
  IF !EMPTY(nH2)
     @ 15,2 SAY "Delete task 2: " + HB_VALTOSTR(nH2)
     HB_IDLEDEL( nH2 )
  ENDIF
  IF !EMPTY(nH1)
     @ 16,2 SAY "Delete task 1: " + HB_VALTOSTR(nH1)
     HB_IDLEDEL( nH1 )
  ENDIF
  IF !EMPTY(nH4)
     @ 17,2 SAY "Delete task 4: " + HB_VALTOSTR(nH4)
     HB_IDLEDEL( nH4 )
  ENDIF

  @ 18,2 SAY "Memory after idle states" + STR( MEMORY(HB_MEM_USED) )
  HB_GCALL()
  @ 19,2 SAY "Memory after collecting" + STR( MEMORY(HB_MEM_USED) )

RETURN 1

PROC TEST()
LOCAL a, b, c
LOCAL cb

  a := ARRAY( 3 )
  b := ARRAY( 3 )
  c := ARRAY( 3 )
  a[1] :=a
  a[2] :=b
  a[3] :=c
  b[1] :=a
  b[2] :=b
  b[3] :=c
  c[1] :=a
  c[2] :=b
  c[3] :=c

  cb := {|x| x:=cb}
  EVAL( cb )

RETURN