METER - CAUSA LENTIDÃO

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

CARDIM
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 14 Ago 2003 13:42
Localização: sao paulo
Contato:

METER - CAUSA LENTIDÃO

Mensagem por CARDIM »

Bom dia turma

Amigos, preciso de ajuda.
Por favor digam que eu estou errado.

Estamos em fase de conversão para o FW26/clipper e fui substituir o famoso "Processando. Aguarde..." pelo "METER".

Tentei simular num DBF real do sistema, contendo 20000 rec e 10 indices (CDX) numa máquina 566 e constatei que a indexação ficou mais lenta 6 vezes (45s antes contra 270s).

Testei num Pentium 4 com 100000 rec e deu a mesma proporção.

Ora, a nossa ideia era colocar o "METER" em todo processamento pesado e indexação.

Temos clientes de todo tipo, alguns com arquivos com mais de 300.000 lançamentos, aproximadamente 100 estações e muitas delas desatualizadas (pão-duros, né??. Não podemos piorar o desempenho em função do mais bonito.

Lá vai o Fonte:

ANTES: -----------------------------------------------------

Código: Selecionar todos

MsgRun( "REINDEXANDO COMERCIAL. AGUARDE!!!....... ","", ;
{|oInd|IF(.NOT.INDSCCoInd) , WINDEXOU:=.F.,.T.)})

FUNC INDSCC
IF.NOT.FUSEX("1","CADCLIEN")
RETU.F.
ELSE
ERASE ICLIEN.CDX
ENDIF
INDEX ON CLIENCOD TAG 01 TO ICLIEN
INDEX ON TRANSCOD TAG 02 TO ICLIEN
INDEX ON VENDECOD TAG 03 TO ICLIEN
INDEX ON STR(REGIOCOD,3,0)+FANTASIA TAG 04 TO ICLIEN
INDEX ON BANCOCOD TAG 05 TO ICLIEN
INDEX ON CONDICOD TAG 06 TO ICLIEN
INDEX ON CLIENTE TAG 07 TO ICLIEN
INDEX ON CGC TAG 08 TO ICLIEN
INDEX ON CPF TAG 09 TO ICLIEN
INDEX ON FANTASIA TAG 10 TO ICLIEN
RETU .T.
DEPOIS------------------------------------------------------

Código: Selecionar todos

MsgMeter( { | oMeter, oText, oDlg, lEnd | ;
IF(.NOT.INDSCC( oMeter, oText, oDlg, @lEnd ) , ; 
WINDEXOU:=.F. ,.T. ) } , ;
"REINDEXANDO COMERCIAL ...........","Aguarde" )

FUNC INDSCC
IF.NOT.FUSEX("1","CADCLIEN")
RETU.F.
ELSE
ERASE ICLIEN.CDX
ENDIF
oMeter:nTotal = RecCount()
oMeter:ctext = "REINDEXANDO CLIENTES 01/10"
INDEX ON CLIENCOD TAG 01 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 02/10"
INDEX ON TRANSCOD TAG 02 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 03/10"
INDEX ON VENDECOD TAG 03 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 04/10"
INDEX ON STR(REGIOCOD,3,0)+FANTASIA TAG 04 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 05/10"
INDEX ON BANCOCOD TAG 05 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 06/10"
INDEX ON CONDICOD TAG 06 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 07/10"
INDEX ON CLIENTE TAG 07 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 08/10"
INDEX ON CGC TAG 08 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 09/10"
INDEX ON CPF TAG 09 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 10/10"
INDEX ON FANTASIA TAG 10 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
RETU .T.

**********************************************
Fico no aguardo dos sábios de plantão..

{}

Cardim
www.cardim.com.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Eu não uso o METER mas apresento a porcentagem da indexação na barra de status de meu sistema usando uma função simples.

...
INDEX ON chave TO indice FOR criterio ;
EVAL dbProgress( oWnd. indice )
...
Passe no primeiro parâmetro a referencia da janela de seu sistema e no segundo o nome do indice.

/*
*
* *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
* Descricao:
* *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
*
*/
FUNCTION dbProgress( oWnd, cIndice )
LOCAL cComplete := LTRIM(STR(INT((RECNO()/LASTREC()) * 100)))
cTexto := OemToAnsi("Indexando arquivo "+cIndice+" (" + cComplete + ")% Completada.")
oWnd:SetMSG( cTexto )
RETURN(.T.)

@braços :?)
Responder