Evitar Gravar em arquivo txt loop infinito
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 :
queria me proteger , caso ocorrra um loop infinito , esse arquivo txt nada sofresse..
Obrigado...
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
Curtidas 0
Respostas
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.
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
28/09/2005
[quote
queria me proteger , caso ocorrra um loop infinito , esse arquivo txt nada sofresse..
...
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
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
28/09/2005
Beleza massuda
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
Aproveitandando esta linha de raciocineo , tem como retornar o arquivo , no estado inicial , Depois que esse erro fora capturado pelo bolco try excepet..
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.
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
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.
Como disse antes, precisaria de mais informação... no mínimo, qual a condição do loop.
GOSTEI 0
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:
Se entrar no loop vc pega o arquivo backup e substitui o outro para q fique como antes. :oops:
GOSTEI 0
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:
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
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
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:
[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
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:
:cry: :cry: :cry: :cry:
GOSTEI 0
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.
Quando vc faz: While 1 = 1 do ;
O Delphi compila, entra em looping infinito e não dá nenhuma mensagem.
GOSTEI 0
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
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´]
[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.
[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
28/09/2005
Citação de beppe
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
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
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 :?: :?: :?:
É 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
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:
Até que o HD esgotar? :shock:
GOSTEI 0
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
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?
Mas convenhamos...se fosse de 1GB, tem certeza que ele seria útil? Que tipo de informações vc quer armazenar nele?
GOSTEI 0
Siam
28/09/2005
Marco, vc está com a síndrome do medo do loop infinito ?
GOSTEI 0
Marco Salles
28/09/2005
:?: :?: :?: :?: :?:
Seje mais objetivo com seus comentários ....
Marco, vc está com a síndrome do medo do loop infinito ?
Seje mais objetivo com seus comentários ....
GOSTEI 0
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.
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
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
28/09/2005
Citacao de siam:
Medo nenhum....
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 :
E Qual seria a melhor massuda
Obrigado...
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
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
28/09/2005
Em geral loops infinitos acarretam num stackoverflow
GOSTEI 0
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´]
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.
[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
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
28/09/2005
[b:6616395d52]Citação de massuda:[/b:6616395d52]
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]
[b:6616395d52]Citação de massuda:[/b:6616395d52]
Continuando ....
[b:6616395d52]Citação de massuda:[/b:6616395d52]
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
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
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]
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
[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
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.
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