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.