creio q esse assunto já foi abordado aqui no fórum, mas pesquisei todos os links e não encontrei uma solução
vou descrever o "problema":
uma determinada estação da rede (chamarei de terminal A) chama um programa que lê um arquivo DBF indexado (CDX) por um campo tipo DATA, utilizando DBSEEK, e demora 20 segundos para finalizar a leitura do arquivo no intervalo solicitado
agora outra estação (chamarei de terminal B) chama o mesmo programa, sendo que a primeira estação que chamou (terminal A) ainda está executando o programa ; o tempo de execução do programa no terminal B até finalizar a leitura dos registros agora é de 1 minuto
se o terminal A chamar novamente o programa, sem que o terminal B abandone, o tempo para finalizar também é de 1 minuto, ou seja, demora nas duas estações o mesmo tempo de 1 minuto quando o acesso ao programa é simultâneo
quando 1 dos terminais abandona o programa, o terminal que permanece executando volta a obter o resultado em 20 segundos
já isolei os trechos do programa e constatei que:
- a "abertura dos arquivos" com DBUSEAREA mantém a mesma velocidade acessando por 1 terminal ou pelos 2 terminais
- o "fechamento dos arquivos" com CLOSE mantém a mesma velocidade acessando por 1 terminal ou pelos 2 terminais
- a velocidade de leitura no while acessando por um terminal é muito mais rápida do que quando está acessando pelos 2 terminais
portanto é o LOOP que está sendo afetado pelo acesso simultâneo, perdendo desempenho
informações sobre o ambiente onde foi testado isso:
- servidor com Windows Server 2012 Standart
- terminais com Windows 7 Professional
nas pesquisas que fiz sobre o assunto me deparei com inúmeras dicas falando sobre o cabeamento da rede, placa de rede, anti-vírus, etc...
mas posso lhes adiantar que a rede está funcionando ok e as estações em que foi testado estão com anti-vírus desabilitado e firewall do windows liberando arquivos DBF, CDX, FPT, etc... (testamos em várias estações)
inclusive em um cliente que reclamou dessa situação o comportamento é o mesmo, testamos em várias estações também para comprovar
a rotina q estamos utilizando para testar é muito simples:
#include 'FiveWin.ch'
Function Teste()
cTime:=TIME()
Select 1
Use "M:\TESTE.DBF" Alias "NF" Shared
Set index to "M:\TESTE.CDX"
dDataIni := CTOD("01/01/2013")
dDataFim := DATE()
nContador := 0
NF->(DBSETORDER(1))
NF->(DBSEEK(DTOS(dDataIni),.T.))
WHILE !NF->(EOF()) .and. NF->NFDATA <= dDataFim
nContador++
NF->(DBSKIP())
ENDDO
? 'Tempo da leitura dos registros: ' + CRLF +;
ElapTime(cTime,TIME()) + CRLF +;
NETNAME() + CRLF +;
ALLTRIM(STR(nContador))+' registros lidos'
// permanecer com esta mensagem em exibição e chamar o programa de outro
// terminal
CLOSE ALL
RETURN
//-----------------------------------------------------------------------------
foi compilado com xHB build 1.1.0 (SimpLex) / BCC 5.5.1 / FW 8.01
agradeço qualquer dica
obrigado
Yury