HowTo. Indexacion MutiThread
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Amigos, aquí tenéis una implementación de una indexacion multihilo, en este caso, me centro en NTX, que es lo que tengo que usar.
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![Wink ;-)](./images/smilies/icon_wink.gif)
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
![Wink ;-)](./images/smilies/icon_wink.gif)
- 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