Página 1 de 1
dbSkip() travando programa após 47 cliques
Enviado: 08 Ago 2014 17:47
por maiconlst
Olá.
Tenho encontrado o seguinte problema:
Para atualizar uma listbox movendo o ponteiro pela tabela de um banco de dados ".dbf" utilizo um botão para avançar e outro para retroceder com a função DbSkip().
A função faz seu trabalho normalmente, no entanto ao clicar 47 vezes o programa deixa de funcionar.
Poderia ser alguma coisa relacionada a uso de memória ou algo assim?
dbSkip() travando programa após 47 cliques
Enviado: 08 Ago 2014 19:09
por alxsts
Olá!
Olhando o enunciado do problema, lembrei daquela música "Mistérios da meia noite...."
Parece algum loop infinito, estouro de pilha, etc...
Que tal postar o código para análise?
dbSkip() travando programa após 47 cliques
Enviado: 09 Ago 2014 08:51
por Itamar M. Lins Jr.
Clica só 46 vezes!
Sem ver o código fica difícil responder algo.
Saudações,
Itamar M. Lins Jr.
dbSkip() travando programa após 47 cliques
Enviado: 09 Ago 2014 10:50
por JoséQuintas
Lembro de detalhes assim no VB6.....
Em ambiente GUI tudo funciona isoladamente, mesmo junto.
Ao clicar, ele começa o processamento e se clicar de novo, vai processar de novo.
Até aí parece normal, mas significa que a rotina pode estar rodando duas vezes ao mesmo tempo.
Por isso convém ao clicar, a primeira coisa seria desativar o(s) botão(ões), e só liberar depois de terminar o processo.
E a listbox... poderão ser várias rotinas mexendo nessa listbox ao mesmo tempo, e aí entra aquele negócio de usar Mutex pra controlar o acesso a variável por várias rotinas ao mesmo tempo, algo parecido com RLock(), só que ao invés de fazer isso com registro de arquivo, vai fazer com a variável de memória.
Programar em GUI requer cuidados extras, porque é multithread, tá tudo rodando ao mesmo tempo.
Mas pensando em algo simples.... colocou a checagem de Eof() ?
dbSkip() travando programa após 47 cliques
Enviado: 09 Ago 2014 16:10
por Euclides
Nosso amiguinho maiconlst já colocou este post no forum da Fivewin.br, portanto o LISTBOX não é do Harbour.
Pode ser o WBROWSE, XBROWSE ou mesmo o TCBROWSE... como vai saber...
Como os colegas já colocaram, é difícil dizer qualquer coisa sem ver as fontes.
Na pasta SAMPLES do Fivewin, existem vários exemplos de Listbox. Cansei de fazer SKIP(+1) e SKIP(-1) n´eles.
Vamos esperar o maiconlst se manifestar.
T+
Euclides
dbSkip() travando programa após 47 cliques
Enviado: 11 Ago 2014 09:32
por maiconlst
Aqui vai o trecho em questão. Se trata de um depurador que tem uma listbox com os nomes dos alias e ao clicar em um registro, abre-se outra listbox com os dados em questão que serão passados para frente ou para tras para se saber o que acontece na tabela com o objetivo de no caso de estar acontecendo um loop no momento da depuração ou algo assim e se saber o que "se passa" na tabela.
Código: Selecionar todos
If vNexPre=="P" /*variavel que diferencia qual botao pressionado para avançar ou retroceder */
&vNameAlias.->(DbSkip())
If (&vNameAlias.->(RecNo()))==vLastRecNo /*"variavel que confere se o ultimo recno antes de apertar o botao"*/
MsgInfo("Este é o último registro da tabela, não é mais possível avançar.")
vLimTab:="U" /* "variavel usada no "When" do redefine do botão para deixar o botão ativo ou inativo"*/
ElseIf vNexPre=="A"
&vNameAlias.->(DbSkip(-1))
If (&vNameAlias.->(RecNo()))==vLastRecNo
MsgInfo("Este é o primeiro registro da tabela, não é mais possível avançar.")
vLimTab:="P"
EndIf
EndIf
dbSkip() travando programa após 47 cliques
Enviado: 11 Ago 2014 09:35
por maiconlst
Abaixo a ListBox:
Código: Selecionar todos
@ 2.0,1 ListBox ListDebug;
Fields cValToChar(VetorDebug[ListDebug:nAt,01]),;
cValToChar(VetorDebug[ListDebug:nAt,02]),;
cValToChar(VetorDebug[ListDebug:nAt,03]),;
cValToChar(VetorDebug[ListDebug:nAt,04]),;
cValToChar(VetorDebug[ListDebug:nAt,05]),;
cValToChar(VetorDebug[ListDebug:nAt,06]);
Headers "Campo",;
"Tipo",;
"Tamanho",;
"Decimal",;
"Flags",;
"Valor";
FieldSizes 75,35,35,40,35,150;
Size 269,100;
Of DialogDebug
dbSkip() travando programa após 47 cliques
Enviado: 11 Ago 2014 10:35
por maiconlst
A questão do EOF() e do BOF() foi me falado tambem no forum do fivewin. Mas mesmo assim o problema persiste.
No caso eu uso um refresh na listbox e finalizo a Dialog a cada clique fazendo assim com que haja a atualização. Para passar os parametros chamo mesma função novamente. Poderia isso estar causando um acumulo de memoria ou algo assim?
dbSkip() travando programa após 47 cliques
Enviado: 11 Ago 2014 11:14
por Euclides
Bom dia,
Com as informações acima, continua difícil fazer qualquer análise. Mas dá para sugerir algo:
1 - Não há necessidade de fechar o DIALOG e reabri-lo. Utilizando oLbx:Refresh() e oDlg:Update() resolve.
Acho que só isso deveria aumentar bem o número de dbskip´s permitidos.
2 - Em vez de usar dbskip(), poderia utilizar oLbx:GoUp() e oLbx:GoDown(). Isso eliminaria o tratamento to EOF()/BOF().
Tente isso e informe.
T+, Euclides
dbSkip() travando programa após 47 cliques
Enviado: 11 Ago 2014 18:07
por maiconlst
Prezados. Consegui resolver o problema. Coloquei os 'dbskip' e as estruturas que moviam o ponteiro em uma função separada acabando com o problema que era na verdade a recursividade.
Obrigado a Todos. :xau
dbSkip() travando programa após 47 cliques
Enviado: 11 Ago 2014 19:44
por alxsts
Olá!
alxsts escreveu:Parece algum loop infinito, estouro de pilha, etc...
dbSkip() travando programa após 47 cliques
Enviado: 28 Ago 2014 18:05
por maiconlst
Creio que o problema era a questão de estouro de pilha mesmo. Porque a função que fazia essa questão do Dbskip chamava ela mesma. A recursividade gerava o Overflow.