Evitar Gravar em arquivo txt loop infinito

Delphi

28/09/2005

Beleza.. Estou fazendo manutenção em um programa ... Isto ja é muito ruim. Mas esse programa tem uma estrutura onde se tem uma laço While .. Acontece que Dentro desse laço se grava informaçoes em um arquivo texto.. Gostaria de me precaver , para que se o programa for processar , evitar de algum modo , se o programa entrar nun loop infinito , que nada seje gravado nesse arquivo ,

A Estrutura esta mais ou menos assim :

While <condicao > do
Gravar No Arquivo Texto


queria me proteger , caso ocorrra um loop infinito , esse arquivo txt nada sofresse..

Obrigado...


Marco Salles

Marco Salles

Curtidas 0

Respostas

Massuda

Massuda

28/09/2005

Marco

Acho que qualquer medida eficiente para evitar loop infinito neste caso irá depender de como funciona o programa. Poderia sugerir usar um contador, um temporizador, etc mas isso depende de o que está sendo escrito e em que condições o programa fica em loop. Moral da estória: seria melhor você detalhar mais o problema.


GOSTEI 0
Motta

Motta

28/09/2005

[quote
queria me proteger , caso ocorrra um loop infinito , esse arquivo txt nada sofresse..
...


Não entendi , a defesa está em não deixar entrar em loop.
Faça uma checagem das condições antes de entrar.
Um aplicação só entra em loop infinito se vc errar o código , ou fixer de propósito ...

Loop´s infinitos , ainda mais com gravação de arquivos acabam num erro de stack overflow.


GOSTEI 0
Marioguedes

Marioguedes

28/09/2005

Sugiro o seguinte codigo:

var
linha : Integer;
begin
(...)
linha := 0;
while (condicao) do
  begin
  Gravar....
  if linha = 1000
    then Break //Aqui está a dica em si
    else Inc(linha);
  end;
(...)
end;



GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

Beleza massuda
Acho que qualquer medida eficiente para evitar loop infinito neste caso irá depender de como funciona o programa.


Mas como disse antes o programa não é meu...
:cry: :cry: :cry:
Existem muitas situaçoes que a gente protege um Bloco com try except finally... :idea: :idea: Pensei que poderia existir algo que ao perceber o loop Infinito , evitasse que o processo de gravação

Não entendi , a defesa está em não deixar entrar em loop. Faça uma checagem das condições antes de entrar. Um aplicação só entra em loop infinito se vc errar o código , ou fixer de propósito ... Loop´s infinitos , ainda mais com gravação de arquivos acabam num erro de stack overflow.


Aproveitandando esta linha de raciocineo , tem como retornar o arquivo , no estado inicial , Depois que esse erro fora capturado pelo bolco try excepet..

var linha : Integer; begin (...) linha := 0; while (condicao) do begin Gravar.... if linha = 1000 then Break //Aqui está a dica em si else Inc(linha); end; (...) end;


Este código , parece que , evitaria o Loop infinito , mas em compensação , mil coisas seriam gravadas desnecessárias ou repetidas no arquivo Txt

Obrigado a todos e no aguardo de mais sugestoes.


GOSTEI 0
Massuda

Massuda

28/09/2005

[quote:5cd2aed379=´Marco Salles´]Este código , parece que , evitaria o Loop infinito , mas em compensação , mil coisas seriam gravadas desnecessárias ou repetidas no arquivo Txt[/quote:5cd2aed379]Poderia acontecer de, numa situação de funcionamento normal, o loop ter de ser executado 1001 vezes... nesse caso, não estaria evitando um loop infinito, mas sim introduzindo um erro no resultado.

Como disse antes, precisaria de mais informação... no mínimo, qual a condição do loop.


GOSTEI 0
Michelli88

Michelli88

28/09/2005

Porque vc nao faz um tipo de um backup?
Se entrar no loop vc pega o arquivo backup e substitui o outro para q fique como antes. :oops:


GOSTEI 0
Macario

Macario

28/09/2005

Olá programador.

Conforme dito, poste a estrutura do while, pois ficaria mais facil de entender.


Agora o que voce poderia estar fazendo é, mandar os dados para uma StringList e depois caso o while tenha sucesso, voce gravaria a StringList;

Essa é minha sugestão.

:roll:


GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

[b:ab4a64d4ce]Obrigado a todos que participam dese tópico[/b:ab4a64d4ce]

[b:ab4a64d4ce]A Questão aqui é um pouco teorica... [/b:ab4a64d4ce]

citacao de Mota
Não entendi , a defesa está em não deixar entrar em loop. Faça uma checagem das condições antes de entrar. Um aplicação só entra em loop infinito se vc errar o código , ou fixer de propósito ...


Vamos supor que se ebtre no loop de forma proposital ...

A Pergunta é :

[b:ab4a64d4ce]A Alguma forma de sair desse loop infinito , restaurar o arquivo Original[/b:ab4a64d4ce]

Queria saber se tem jeito via programaçao fazer o que a michelli sugeriu:

Porque vc nao faz um tipo de um backup? Se entrar no loop vc pega o arquivo backup e substitui o outro para q fique como antes.



GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

Sera que não da para fazer este Tratamento ???? O Delphi não gera nenhuma mensagem interna , para que possamos trata-la ????

:cry: :cry: :cry: :cry:


GOSTEI 0
Siam

Siam

28/09/2005

Msg de looping ?
Quando vc faz: While 1 = 1 do ;
O Delphi compila, entra em looping infinito e não dá nenhuma mensagem.


GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

Msg de looping ? Quando vc faz: While 1 = 1 do ; O Delphi compila, entra em looping infinito e não dá nenhuma mensagem.


Certeza disso :!: :!: :!:


GOSTEI 0
Beppe

Beppe

28/09/2005

Oi.

[quote:2a16086ead=´Marco Salles´]Existem muitas situaçoes que a gente protege um Bloco com try except finally... :idea: :idea: Pensei que poderia existir algo que ao perceber o loop Infinito[/quote:2a16086ead]
Loop infinito é apenas um jargão, técnicamente são apenas um pulo para o mesmo lugar, e o delphi não monitora a execução do programa.
[quote:2a16086ead=´Marco Salles´]evitasse que o processo de gravação[/quote:2a16086ead]
A sugestão da michelli88 é a que mais se aproxima de processamento de transações no sistema de arquivos.

[quote:2a16086ead=´Marco Salles´]
Porque vc nao faz um tipo de um backup? Se entrar no loop vc pega o arquivo backup e substitui o outro para q fique como antes.
[/quote:2a16086ead]

[quote:2a16086ead=´Marco Salles´]Sera que não da para fazer este Tratamento ???? O Delphi não gera nenhuma mensagem interna , para que possamos trata-la ????[/quote:2a16086ead]
É erro de lógica, então o Delphi não dá bola. Faça o loop finito. Se sua pergunta é sair do loop, a resposta é Break.


GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

Citação de beppe
É erro de lógica, então o Delphi não dá bola.


Entendido.. Mas suponha que em cada while , o arquivo txt seje carregado... Ira chegar uma hora que ele não suporta mais a inclusão de dados.. Não existe , nenhuma mensagem do windows ou do delphi que se possa tratar neste caso , para ai sim , fazer o que a michelli sugeriu

Citação de beppe
Se sua pergunta é sair do loop, a resposta é Break.


Porque eu nun to entendendo... Como eu vou dar um Break ???

Ou colocando um parametro , como foi comentado sugerido pelo amigo marioguedes , mas ai nesse caso incorre na sugestão do massuda

citacao de massuda
Poderia acontecer de, numa situação de funcionamento normal, o loop ter de ser executado 1001 vezes... nesse caso, não estaria evitando um loop infinito, mas sim introduzindo um erro no resultado.


Eu gostaria de dar um Break , na situção de um erro ... Se não dar para definir , um loop infinito , sera que daria para pelo menos defiir um Arquivo Txt com capacidade esgotada < Digamos assim > e neste caso gerar um Erro :?: :?: :?:


GOSTEI 0
Beppe

Beppe

28/09/2005

[quote:d003c9456f=´Marco Salles´]Ira chegar uma hora que ele não suporta mais a inclusão de dados.. [/quote:d003c9456f]
Até que o HD esgotar? :shock:


GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

Marco Salles escreveu: Ira chegar uma hora que ele não suporta mais a inclusão de dados.. [quote:c029735b44]Até que o HD esgotar?
[/quote:c029735b44]

Se não me engano , o txt , tem capacidade limitada . Bem menor do que o Hd


GOSTEI 0
Beppe

Beppe

28/09/2005

Depende do SO...mas pelo menos 2GB.

Mas convenhamos...se fosse de 1GB, tem certeza que ele seria útil? Que tipo de informações vc quer armazenar nele?


GOSTEI 0
Siam

Siam

28/09/2005

Marco, vc está com a síndrome do medo do loop infinito ?


GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

:?: :?: :?: :?: :?:
Marco, vc está com a síndrome do medo do loop infinito ?


Seje mais objetivo com seus comentários ....


GOSTEI 0
Siam

Siam

28/09/2005

Objetivando . . .

Não foi um comentário, foi uma pergunta.
Vc está com medo do seu programa entrar em looping ?

O Delphi pode até saber que está em looping; o que ele não sabe é se o looping provem de um erro de lógica ou da vontade do programador.


GOSTEI 0
Massuda

Massuda

28/09/2005

Você está tentando implementar um arquivo de log? Nesse caso a melhor abordagem não seria a que você está sugerindo.


GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

Citacao de siam:
Não foi um comentário, foi uma pergunta. Vc está com medo do seu programa entrar em looping ?


Medo nenhum....

O Delphi pode até saber que está em looping; o que ele não sabe é se o looping provem de um erro de lógica ou da vontade do programador.


Mas é isto que eu estou querendo saber .. Como o delphi sabe quando o processo esta nun loop Infinito .. É Como fazer para sair dele ,sem usar um contador... O Delphi gera alguma mensagem quando isto ocorre???

Obrigado...

Citação de massuda :
Você está tentando implementar um arquivo de log? Nesse caso a melhor abordagem não seria a que você está sugerindo.

E Qual seria a melhor massuda

Obrigado...


GOSTEI 0
Siam

Siam

28/09/2005

Mas é isto que eu estou querendo saber .. Como o delphi sabe quando o processo esta nun loop Infinito .. É Como fazer para sair dele ,sem usar um contador... O Delphi gera alguma mensagem quando isto ocorre???
Como o Dephi sabe, isso eu não sei se ele sabe. Se vc não quiser usar um contador, pode verificar o tempo que está em loop pela função GetTickCount.


GOSTEI 0
Motta

Motta

28/09/2005

Em geral loops infinitos acarretam num stackoverflow


GOSTEI 0
Massuda

Massuda

28/09/2005

[quote:c45bd12829=´Marco Salles´]Como o delphi sabe quando o processo esta nun loop Infinito...[/quote:c45bd12829]Você tem algum exemplo de que o Delphi sabe que um processo está em loop inifinito?
[quote:c45bd12829=´Marco Salles´]
Você está tentando implementar um arquivo de log? Nesse caso a melhor abordagem não seria a que você está sugerindo.

E Qual seria a melhor...[/quote:c45bd12829]Se você está implementando um arquivo de log, não vejo relação entre entrar em loop infinito e o arquivo de log.

A questão de loop infinito é problema do programa, que deve detectar a condição de erro. Eu sei que não foi você que fez o programa, mas deve ter como identificar uma condição de erro.

Um arquivo de log para ter algum uso prático, deve ter um tamanho que permita manipular ele, transferir ele por email/fax, etc o que significa que você deve limitar o tamanho desse arquivo em alguns MBs ou menos. Alguns programas usam uma espécie de lista circular para manter o log.

Outro ponto importante é que o arquivo de log precisa ser ´flushado´ a cada atualização, isto é, ele não pode ser bufferizado seja pelo programa seja pelo SO; normalmente, o conteúdo de um arquivo é escrito apenas quando ele é fechado, mas no caso isso não é aceitável, pois você irá precisar do log no caso do programa terminar de modo anormal.

Em geral loops infinitos acarretam num stackoverflow
Não necessariamente. Estouro de pilha normalmente está relacionado com funções/procedures recursivas, pois a chamada de função/procedure envolve consumir a pilha; num loop infinito comum (por exemplo, while True do...), geralmente não envolve consumo da pilha.


GOSTEI 0
Motta

Motta

28/09/2005

Por isto o ´em geral´ Massuda, no caso citado como envolve gravação de arquivo daria erro ou de pilha ou de limite de arquivo.


GOSTEI 0
Marco Salles

Marco Salles

28/09/2005

[b:6616395d52]Citação de massuda:[/b:6616395d52]
[quote:6616395d52]Marco Salles escreveu: Como o delphi sabe quando o processo esta nun loop Infinito...

Você tem algum exemplo de que o Delphi sabe que um processo está em loop inifinito? [/quote:6616395d52]

Não massuda... Voce não entendeu.. Eu não estouafirmando isso . Eu estou apenas perguntando.

[b:6616395d52]Como o delphi sabe quando o processo esta nun loop infinito ?????[/b:6616395d52]

A conclusão que eu estou obtendo é que ele não sabe .. Independende se o erro for proposital ou for erro de Lógica . E alem disso esse erro que o mota sugeriu , nçao dá para tratar num Bloco [b:6616395d52]try exceptd [/b:6616395d52], ja que como voce coloca , isso nen sempre ocorrerá
[b:6616395d52]Citaçao de motta:[/b:6616395d52]
Em geral loops infinitos acarretam num stackoverflow

[b:6616395d52]Citação de massuda:[/b:6616395d52]
Não necessariamente...


Continuando ....

[b:6616395d52]Citação de massuda:[/b:6616395d52]
Se você está implementando um arquivo de log, não vejo relação entre entrar em loop infinito e o arquivo de log.

A relação esta em que nesse loop , grava-se no arquivo txt ,,, e se este loop é infinito , este arquivo fica com um tamanho muito grande e depois nen consigo abri-lo.. E so me resta deleta-lo

Citação de massuda
Outro ponto importante é que o arquivo de log precisa ser ´flushado´ a cada atualização, isto é, ele não pode ser bufferizado seja pelo programa seja pelo SO;


Mas nesse caso acho que a opção do buffer é melhor .. Porque se ele entrar nun loop infinito o aplicativo sera encerrado e nada sera gravado no Arquivo txt.. [b:6616395d52]Mas como diferenciar entre essa opções ????[/b:6616395d52]
:cry: :cry: :cry:

Citação de massuda
Um arquivo de log para ter algum uso prático, deve ter um tamanho que permita manipular ele, transferir ele por email/fax, etc o que significa que você deve limitar o tamanho desse arquivo em alguns MBs ou menos.

E para saber quando se esta nun loop , posso vigiar o tamanho do arquivo..[b:6616395d52] Quando o tamanho do arquivo chegar ao limite dou um Break no While e encerro o programa[/b:6616395d52]

[b:6616395d52]citação de massuda:[/b:6616395d52]
A questão de loop infinito é problema do programa, que deve detectar a condição de erro. Eu sei que não foi você que fez o programa, mas deve ter como identificar uma condição de erro.

Claro. Com certeza... Isto eu vou fazer... A questão sobre o loop infinito , e o tamanho do arquivo é mais teórica. Serve como aprendizado e gostaria muito de tomar conhecimentos dessas medidas

Espero ter sido claro.

Obrigado


GOSTEI 0
Massuda

Massuda

28/09/2005

[quote:b378e0a611=´Marco Salles´]Como o delphi sabe quando o processo esta nun loop infinito ?????
A conclusão que eu estou obtendo é que ele não sabe .. [/quote:b378e0a611]De fato, em nenhuma linguagem de programação que conheço é possível, sem informação adicional, determinar que um programa entrou em loop infinito e considerar essa situação um erro.

[quote:b378e0a611=´Marco Salles´]A relação esta em que nesse loop , grava-se no arquivo txt ,,, e se este loop é infinito , este arquivo fica com um tamanho muito grande...a opção do buffer é melhor .. Porque se ele entrar nun loop infinito o aplicativo sera encerrado e nada sera gravado no Arquivo txt..[/quote:b378e0a611]Afinal, você está gerando um arquivo de log ou um arquivo de dados? No arquivo de log, é importante ter uma lista completa do que ocorreu, não esconder problemas. Se for um arquivo de dados que está sendo gravado errado, evitar que ele seja gerado dessa forma é apenas um paliativo, não resolve a causa do problema.


GOSTEI 0
POSTAR