pauloaraujo Posted April 20, 2005 Report Share Posted April 20, 2005 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: ----------------------------------------------------- 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------------------------------------------------------ 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. Paulo/CONTATO SISTEMAS FW26/Clipper53b/BLINKER7 contato@pleno.com.br Quote Link to comment Share on other sites More sharing options...
qiinfo Posted April 20, 2005 Report Share Posted April 20, 2005 Olá Paulo, Tente isto: FUNC INDSCC local PASSO := (cAlias)->(OrdKeycount()) / 100 INDEX ON CLIENCOD TAG 01 TO ICLIEN ; EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd ) ; every PASSO for !deleted() Eu uso o teste "for !deleted" para que o meu browse fique com uma linha branca e a outra verde claro. Note que a variável "PASSO" eu dividi por 100 pois corresponde a 100%. Com isto voce irá ganhar tempo na indexação... Use este esquema em todos os comando "INDEX"... Abraços, Rossine. Rossine FW 2.2c + @say + Clipper 5.2e + libs 5.3b / FWH 2.5 + @say + xHarbour Comercial Quote Link to comment Share on other sites More sharing options...
qiinfo Posted April 20, 2005 Report Share Posted April 20, 2005 Em tempo... Troque a linha: local PASSO := (cAlias)->(OrdKeycount()) / 100 para: local PASSO := RecCount() / 100 ou: local PASSO := OrdKeycount() / 100 Abraços, Rossine FW 2.2c + @say + Clipper 5.2e + libs 5.3b / FWH 2.5 + @say + xHarbour Comercial Quote Link to comment Share on other sites More sharing options...
pauloaraujo Posted April 20, 2005 Author Report Share Posted April 20, 2005 Rossine, Nota 1000. Funcionou perfeitamente a sua instrução e com o mesmo tempo de processamento de antes, sem METER. Pentium 4 + 110000 registros + 10 indices = 20 segundos. Muito Obrigado. Paulo/CONTATO SISTEMAS FW26/Clipper53b/BLINKER7 contato@pleno.com.br Quote Link to comment Share on other sites More sharing options...
zima Posted December 6, 2005 Report Share Posted December 6, 2005 Olá amigos, Sei que a dúvida deve ser banal ... mas o que signicaria o: ! lEnd abaixo ? No momento da execução o programa está parando com a msg: Varible does not exist:LEND Obrigado ! Zima INDEX ON CLIENCOD TAG 01 TO ICLIEN ; EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd ) ; Quote Link to comment Share on other sites More sharing options...
pauloaraujo Posted December 6, 2005 Author Report Share Posted December 6, 2005 Zima, tudo bem???? Recordar é viver. Esta foi a 1ª mensagem que postei no Fórum. Basta declarar a variável no ÃnÃcio da rotina que não dará mais este erro. PRIV LEND Um abraço Paulo Araújo Clipper53b/FW26/Blinker70 Ajudar é um prazer, agradecer é uma obrigação Quote Link to comment Share on other sites More sharing options...
personal Posted December 7, 2005 Report Share Posted December 7, 2005 testei e realmente a coisa mudou 100% Agora, quando usamos o meter para mostrar um processamento, tipo atualização de saldo, alguma coisa parecida. Como fazer para melhorar a velocidade. Quote Link to comment Share on other sites More sharing options...
zima Posted December 7, 2005 Report Share Posted December 7, 2005 Olá Paulo, tudo certo ? Obrigado pelo retorno ! Fiz conforme você mencionou, mas agora deu outro erro: ARGUMENT ERROR: .NOT. O que poderia estar errado ?? Um abraço, Zima PS.: essa váriavel lEnd poderia ter outro nome qualquer ? Quote Link to comment Share on other sites More sharing options...
pauloaraujo Posted December 7, 2005 Author Report Share Posted December 7, 2005 Zima, Eu uso assim, sem erros: PRIV LEND 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" ............. Paulo Araújo Clipper53b/FW26/Blinker70 Ajudar é um prazer, agradecer é uma obrigação Quote Link to comment Share on other sites More sharing options...
elitenet Posted December 7, 2005 Report Share Posted December 7, 2005 Caros Amigos Voces podem usar tambem a classe TProgress ( xHarbour ) que monta os meters no formato do Windows XP. Ela possui o every na classe mesmo, onde vc determina de quanto em quanto registros ele ira atualizar o meter. Marcelo Gomes elitenet@terra.com.br FW 2.3C/CLIPPER 5.2E/BLINKER 7.0 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 7, 2005 Report Share Posted December 7, 2005 lEnd, já esta definido na classe MSGMETER.PRG em: fw..\source\classes copie-o para o seu diretorio de trabalho, abra-o, modifique a gosto, depois incorpore ao seu RMK e LNK. É absolutamente desnecessário declarara-lo como PRIVATE ou PUBLIC, já que ele já existe na classe... ??????????? O link para download do projeto xDev é este: http://www.sqllib.com.br/xDev.zip http://www.sqlmanager.net/en/products/mysql/manager/download João Santos - São Paulo. kmt_karinha@pop.com.br FW 2.3C CLIP 5.3B FWH 2.7 - BLINKER 7.0 WorkShop.Exe Quote Link to comment Share on other sites More sharing options...
jcleoner Posted December 7, 2005 Report Share Posted December 7, 2005 Oi Paulo O meter ou progress sempre serão mais lentos do que quando usávamos em DOS um esquema de mensagem. Pelos testes que fiz o progress é bem superior ao meter quando se trata de velocidade. O ideal é só colocarmos um meter ou progress quando realmente for necessário pois acaba sempre dando bastante comunicação entre o servidor e a estação para atualizar os percentuais, gerando toda a demora de processamento. José Carlos Guarulhos-SP FW 2.0 / Clipper 5.2e / WS | FWH 2.5 / xHarbour / xMate / Pelles Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.