Bom eu não sabia usar o Harbour, então eu aprendi hoje mesmo como compilar um sistema básico e compilei o mesmo exemplo que tinha feito no Clipper e no VFP.
Primeiramente eu criei o exemplo que chamo de TESTE3:
Este exemplo cria 1 arquivo e gera 1000 registros no mesmo, em modo exclusivo e em modo compartilhado.
Ao executar o TESTE3 em meu computador um I5 deu o seguinte resultado:
XHARBOUR:
Exclusivo: 0.01
Compartilhado: 0.03
CLIPPER:
Exclusivo: 0.00
Compartilhado: 0.05
VFP 9.0:
Exclusivo: 0.01
Compartilhado: 0.07
Até aqui tudo bem, é sabido que o DBF aberto em modo compartilhado tem de executar funções de controle e proteção o que gasta mais tempo.
Agora a grande surpresa esta quando eu executo em outro terminal da rede o programa do TESTE2, que é um programa simples que apenas abre o arquivo também compartilhado e não faz nada mais.
Com o TESTE2 executando em outro terminal o modo exclusivo não funciona então o resultado é apenas do modo compartilhado.
XHARBOUR: Compartilhado: 4.09
CLIPPER: Compartilhado: 4.06
VFP 9.0: Compartilhado: 3.24
CONCLUSÃO:
Comprovadamente é uma limitação do DBF, porque as linguagens apresentaram o mesmo problema, tendo uma perda de velocidade muito grande.
Será que alguém sabe uma solução que não seja abrir e fechar sempre que vai manipular um arquivo?
O problema no meu sistema esta na hora de fazer relatório, porque se alguém estiver com a tela de produto aberta quando outro for fazer um relatório demora muito, passando de segundos para minutos o tempo de visualizar um relatório.
Obs1.: Ja fiz o teste usando DBFNTX e DBFCDX, e o resultado é o mesmo.
Obs2.: Se alguém tiver outras sugestões de teste irei analisar.
* TESTE 3
Código: Selecionar todos
Function MAIN()
aCria := {}
Aadd( aCria, { 'PR_PTMP', 'N',17,2 } ) // TMP
Aadd( aCria, { 'PR_VTMP', 'N',17,2 } ) // TMP
if !file('PRO.DBF')
DbCreate( 'PRO',aCria )
endif
use PRO EXCL
if used()
nTempo = seconds()
For i=1 to 1000
APPEND BLANK
Repl PR_PTMP with 0
Repl PR_VTMP with 0
unlock
Next i
? 'EXCLUSIVO'
? seconds() - nTempo
?
zap
endif
use PRO shared
go top
nTempo = seconds()
For i=1 to 1000
APPEND BLANK
Repl PR_PTMP with 0
Repl PR_VTMP with 0
unlock
Next i
? 'COMPARTILHADO'
? seconds() - nTempo
?
ReturnCódigo: Selecionar todos
Function MAIN()
cNada = space(20)
use pro shared
@ 10,10 get cNADA
read
Return .T.

