Tava revendo as mensagens...
Quando comecei a usar índices CDX tive problemas de lentidão, na época ainda era o Windows 98.
Foi nessa época que comecei a usar a OSLIB.
Meu EXE de Clipper, quando parei de usar o Clipper, tinha 4MB e compactado 1.5MB, então esqueça tamanho de EXE.
Se puder, é igual a propaganda, esqueça overlay, use Blinker 7.0 e modo extendido.
Por mais que ajuste as overlays vai ficar limitado a 640kb de memória, e com Blinker 7.0 e modo extendido, pode usar até 16MB pro Clipper.
Exospace também é bom, está num limite entre o normal e Blinker.
Não sei as outras LIBs, só conheço as que usei:
usava só clipper + blinker 7.0 + OSLIB, e parte da superlib pra mouse.
No programa principal acrescentei OL_AutoYield(.t.)
E em todos os locais possíveis, coloquei OL_Yield()
Pra facilitar, troquei todos os Inkey() por MyInkey(), e em MyInkey() tratei de colocar chamada extra pra OL_Yield(), com tratamento por tempo, pra não exagerar - até mesmo durante a indexação eu tinha isso, e até na getsys.
Isto da OSLIB foi pra liberar tempo ao Windows, pois como o Windows é que faz a comunicação da rede, se o programa Clipper usar 100% de CPU, o Windows não tem tempo de tratar a rede.
Coloquei isso no tempo do Windows 98 e nunca mais precisei mexer em nada.
Nunca precisei mexer na configuração de nenhum computador, a não ser mapear unidade de rede, e o limite de arquivos em config.nt.
Um extra do blinker é embutir o parâmetro CLIPPER=F250 no EXE, e dispensa alteração do autoexec.nt.
Rotinas como esta: - Aqui importantíssimo, porque o windows é que vai ficar vendo se foi liberado, e precisa tempo pra isso.
Do While .t.
If rLock()
Exit
Endif
MyInkey(0.5) // OL_Yield()
Enddo
Aonde era Inkey(0).....
nKey := 0
Do While nKey == 0
OL_Yield()
nKey := Inkey()
Enddo
As mudanças acima alteram o consumo de CPU de 100% para ZERO.
Nas telas de GETs, que são por Inkey(0)..... aí entra a vantagem de trocar na getsys o Inkey(0) por MyInkey(0), assim não fica multiplicando rotinas dentro dos fontes.
Isso se o problema for esse, de consumo de CPU.....
Segue a rotina que usava como MyInkey() e a IdleTo95() onde fazia o ajuste fino nos processos.
Código: Selecionar todos
function MyInkey(mTempo)
Local nKey := 0
Local nSeconds := 0
Local mAcao
mTempo := iif(mTempo==NIL,-1,mTempo)
nSeconds := Seconds()
do while .t.
IdleToW95((mTempo != -1))
nKey := Inkey()
do case
case nKey != 0
exit
case mTempo == 0
case Seconds() - nSeconds >= mTempo
exit
endcase
enddo
if ( mAcao := SetKey(nKey) ) != NIL .and. mHotKey
Eval(mAcao,ProcName(),ProcLine(),ReadVar())
nKey := 888
endif
return nKey
function IdleToW95(mForcaIdle)
Static IdleSeconds := 0
Static IdleTime := "00:00:00"
mForcaIdle := Iif(mForcaIdle==NIL,.f.,mForcaIdle)
If IdleTime != Time() .Or. mForcaIdle
IdleSeconds += 1
IdleTime := Time()
If IdleSeconds > 1 .Or. mForcaIdle // pra chamar OL_Yield() somente a cada 2 segundos
IdleSeconds := 0
OL_Yield()
Endif
Endif
return NIL
Só pra dar uma idéia do resultado:
De vez em quando, na minha máquina, eu colocava uns 10 sistemas de clientes pra reindexar ao mesmo tempo, processar arquivos, etc... e enquanto isso eu ia usando a máquina pra outras coisas...