Clipper On Line • Ver Tópico - dbSkip() travando programa após 47 cliques

dbSkip() travando programa após 47 cliques

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

 

dbSkip() travando programa após 47 cliques

Mensagempor maiconlst » 08 Ago 2014 17:47

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?
maiconlst
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 15 Jul 2014 16:36
Cidade/Estado: Paracatu/MG
Curtiu: 0 vez
Mens.Curtidas: 0 vez

dbSkip() travando programa após 47 cliques

Mensagempor alxsts » 08 Ago 2014 19:09

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?
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

dbSkip() travando programa após 47 cliques

Mensagempor Itamar M. Lins Jr. » 09 Ago 2014 08:51

Clica só 46 vezes!

Sem ver o código fica difícil responder algo.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

dbSkip() travando programa após 47 cliques

Mensagempor JoséQuintas » 09 Ago 2014 10:50

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() ?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

dbSkip() travando programa após 47 cliques

Mensagempor Euclides » 09 Ago 2014 16:10

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
Euclides
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 154
Data de registro: 12 Mai 2007 14:07
Cidade/Estado: São Paulo, Capital
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

dbSkip() travando programa após 47 cliques

Mensagempor maiconlst » 11 Ago 2014 09:32

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.

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
maiconlst
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 15 Jul 2014 16:36
Cidade/Estado: Paracatu/MG
Curtiu: 0 vez
Mens.Curtidas: 0 vez

dbSkip() travando programa após 47 cliques

Mensagempor maiconlst » 11 Ago 2014 09:35

Abaixo a ListBox:

     @ 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
maiconlst
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 15 Jul 2014 16:36
Cidade/Estado: Paracatu/MG
Curtiu: 0 vez
Mens.Curtidas: 0 vez

dbSkip() travando programa após 47 cliques

Mensagempor maiconlst » 11 Ago 2014 10:35

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?
maiconlst
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 15 Jul 2014 16:36
Cidade/Estado: Paracatu/MG
Curtiu: 0 vez
Mens.Curtidas: 0 vez

dbSkip() travando programa após 47 cliques

Mensagempor Euclides » 11 Ago 2014 11:14

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
Euclides
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 154
Data de registro: 12 Mai 2007 14:07
Cidade/Estado: São Paulo, Capital
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

dbSkip() travando programa após 47 cliques

Mensagempor maiconlst » 11 Ago 2014 18:07

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
maiconlst
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 15 Jul 2014 16:36
Cidade/Estado: Paracatu/MG
Curtiu: 0 vez
Mens.Curtidas: 0 vez

dbSkip() travando programa após 47 cliques

Mensagempor alxsts » 11 Ago 2014 19:44

Olá!

alxsts escreveu:Parece algum loop infinito, estouro de pilha, etc...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

dbSkip() travando programa após 47 cliques

Mensagempor maiconlst » 28 Ago 2014 18:05

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.
maiconlst
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 15 Jul 2014 16:36
Cidade/Estado: Paracatu/MG
Curtiu: 0 vez
Mens.Curtidas: 0 vez




Retornar para FiveWin

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 9 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro