I believe this example is interesant. Regards Rafa Carmona
/* 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 ? "Process.: " + cDbf hb_threadStart( @aCreateIndexe(), cDbf, aNtx[ cDbf:__enumindex ], aExpr[ cDbf:__enumindex ], cDbf:__enumindex ) next ? "Wait for threads ...." hb_threadWaitForAll() ? hb_valTostr( Seconds() - nSeconds ) ? "finish" 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 ) } ) // wait threads childs 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 _______________________________________________ Harbour mailing list (attachment size limit: 40KB) Harbour@harbour-project.org http://lists.harbour-project.org/mailman/listinfo/harbour