Funciona solamente con Harbour, no con xHarbour.
Para compilarlo , hbmk2 test -mt
ejecutar test 1 // Crea las dbfs de prueba
NOTA:Atentos, es un concepto de implementación, NO os pongais a crear hilos a cascoporro
Espero que veáis lo curioso que resulta ver el experimento
- Code: Select all Expand view
/*
Example multiThreads index.
One thread by table , and one thread by index.
2010 Rafa Carmona
Thread Main
|---------> Thhread child table for test.dbf
| |----> Thread child index fname
| |
| |----->Thread child index fcode
|
|---------> Thhread child table for test2.dbf
|----->Thread child index fname2
*/
#include "hbthread.ch"
proc Main( uCreate )
Local nSeconds
Local aFiles := { "test", "test2" } // Arrays files dbf
Local aNtx := { { "fname", "fcode" },; // files index for test
{ "fName2" } } // files index for test2
Local aExpr := { { "name", "code" },;
{ "dtos(fecha)+str(code)" } } // Expresions
Local cDbf
if empty( lCreate )
lCreate := "0"
endif
setmode( 25,80 )
cls
if uCreate = "1"
? "Create test.dbf and test2.dbf"
dbCreate("test",{ {"name","C",1,0 },{"code","N",7,0 } } )
use test
while lastRec() < 1000000
dbAppend()
field->name := chr( recno() )
field->code := recno()
enddo
close
dbCreate("test2",{ {"fecha","D",8,0 },{"code","N",7,0 } } )
use test2
while lastRec() < 1000000
dbAppend()
field->fecha := date() + recno()
field->code := recno()
enddo
close
endif
cls
// Threads
nSeconds := Seconds()
for each cDbf in aFiles
? "Procesando..: " + cDbf
hb_threadStart( @aCreateIndexe(), cDbf, aNtx[ cDbf:__enumindex ], aExpr[ cDbf:__enumindex ], cDbf:__enumindex )
next
? "Esperando a los hilos ...."
hb_threadWaitForAll()
? hb_valTostr( Seconds() - nSeconds )
? "Salgo"
return
function aCreateIndexe( cFile, aNtx, aExpr, nPosDbf )
Local nContador := 1
Local cFileNtx, cExpr
Local nLong := Len( aNtx )
Local aThreads := {}
Local cAlias
use ( cFile )
cAlias := alias()
hb_dbDetach( cAlias ) // Libero el alias
for each cFileNtx in aNtx
cExpr := aExpr[ cFileNtx:__enumindex ]
nContador := 1
nPos := cFileNtx:__enumindex
aadd( aThreads, hb_threadStart( @crea(), cAlias,cExpr, cFileNtx, nPos, nPosDbf ) )
next
aEval( aThreads, { |x| hb_threadJoin( x ) } ) // Espera que termine los hilos hijos
hb_dbRequest( cAlias, , , .T.) // Restaura el alias
close
RETURN NIL
proc crea( cAlias, cExpr, cFileNtx, nPos, nPosDbf )
Local nContador := 1
hb_dbRequest( cAlias, , , .T.) // Restaura el alias
INDEX ON &(cExpr) TO &(cFileNtx) ;
EVAL {|| hb_dispOutAt( nPosDbf, iif( nPos = 1, 20, 40 ), alltrim( hb_valtostr( nContador) ), "GR+/N" ), nContador += INT( LASTREC() / 100 ) , .T. } ;
EVERY INT( LASTREC() / 100 )
hb_dbDetach( cAlias ) // Libera el alias
return