Halt(0); ou Application.Terminate???
09/02/2006
0
Paullsoftware
Post mais votado
09/02/2006
desculpe , esta ultima colocaçao para o PaullSoftware
e não tem relação com a resposta do cabelo
Com relação a resposta do cabelo
Acho que não procede isto.. :cry: :cry: :cry:
Marco Salles
Mais Posts
09/02/2006
Paullsoftware
simples assim... então pra que existem essas opções!
09/02/2006
Cabelo
A função Halt(); é utilizada para fechar TODOS os forms de um determinado nível, indicado pelo número que passamos como parâmetro...
exemplo... se tiver 5 forms abertos... sendo 1 principal, outros 2 como filhos e mais dois como netos...
se desejar fechar os forms do 3º nível, então dou um Halt(2).. E ASSIM POR DIANTE...
Já o método terminate, fecha a aplicação, independente de onde você está chamando-a, sem dar erro. Pois esse método elimina da mamória todos os forms e componentes criados pela aplicação.
09/02/2006
Marco Salles
Uma coisa é finalizar a aplicação outra coisa e forçar com que a aplicação feche imediatamente...
09/02/2006
Rjun
O Halt interrompe de forma abrupta a execução. O número entre parenteses é um código de erro que pode ser capturado pela variavel ERRORLEVEL do SO. Esse código de erro eu utilizava em arquivos .BAT.
09/02/2006
Michael
[b:63eecd0c7d]Halt [/b:63eecd0c7d]fecha a aplicação de forma anormal, não liberando a memória alocada pelos objetos, recursos consumidos, etc. O seu único parâmetro é o [b:63eecd0c7d]ExitCode [/b:63eecd0c7d]retornado ao sistema operacional, e não tem relação com a quantidade de forms abertos.
[b:63eecd0c7d]Terminate [/b:63eecd0c7d]fecha a aplicação, assegurando que tudo que foi alocado seja liberado. Em outras palavras, chama o método [b:63eecd0c7d]Free [/b:63eecd0c7d]para todos os componentes, que chamarão [b:63eecd0c7d]Free [/b:63eecd0c7d]para os componentes que são seus ´filhos´ (definidos através do parâmetro [b:63eecd0c7d]Owner [/b:63eecd0c7d]no construtor). Também dispara uma mensagem para o Windows, para garantir que tudo seja destruído na ordem certa. Por essa razão [b:63eecd0c7d]Terminate [/b:63eecd0c7d]pode demorar alguns segundos para fechar a aplicação, enquanto [b:63eecd0c7d]Halt [/b:63eecd0c7d]é imediato.
Existe a propriedade [b:63eecd0c7d]Terminated[/b:63eecd0c7d], da classe [b:63eecd0c7d]TApplication[/b:63eecd0c7d], que pode ser usada para saber se a aplicação está em processo de shut down. Isso pode ser útil para não executar nenhum código quando a aplicação estiver sendo finalizada.
O método [b:63eecd0c7d]Close [/b:63eecd0c7d]da classe [b:63eecd0c7d]TCustomForm [/b:63eecd0c7d]chama [b:63eecd0c7d]Application.Terminate[/b:63eecd0c7d] caso o formulário seja o [b:63eecd0c7d]MainForm [/b:63eecd0c7d]da aplicação. Portanto, ambos têm o mesmo efeito nesse caso.
Portanto, na maioria dos casos, use [b:63eecd0c7d]Terminate [/b:63eecd0c7d]ou [b:63eecd0c7d]Close[/b:63eecd0c7d], se o form for o principal.
09/02/2006
Marco Salles
17/02/2006
Paullsoftware
abraço a todos... :lol:
17/02/2006
Michael
Gostaria de retificar algo que afirmei em meu último post neste tópico:
Isso não está correto. Ao contrário do que falei, [b:389689a045]Halt[/b:389689a045] respeita os objetos criados pela aplicação, que tenha sido inicializados com o parâmetro [b:389689a045]Owner [/b:389689a045]apontando para algo gerenciado pelo aplicativo, como o formulário principal. Desta forma chamar [b:389689a045]Halt [/b:389689a045]não irá deixar memória desalocada desnecessariamente. É claro que o sistema operacional pode não repor totalmente a memória consumida, mas isso tbm poderia ocorrer com [b:389689a045]Terminate[/b:389689a045].
Constatei meu erro ao ler a documentação do Delphi e após umas ´olhadas´ no código fonte da VCL. ;-)
Bom, corrigido! :-D
[]´s[b:389689a045][/b:389689a045]
17/02/2006
Martins
Isso não está correto. Ao contrário do que falei, [b:a0d3eef0bf]Halt[/b:a0d3eef0bf] respeita os objetos criados pela aplicação, que tenha sido inicializados com o parâmetro [b:a0d3eef0bf]Owner [/b:a0d3eef0bf]apontando para algo gerenciado pelo aplicativo, como o formulário principal. Desta forma chamar [b:a0d3eef0bf]Halt [/b:a0d3eef0bf]não irá deixar memória desalocada desnecessariamente. É claro que o sistema operacional pode não repor totalmente a memória consumida, mas isso tbm poderia ocorrer com [b:a0d3eef0bf]Terminate[/b:a0d3eef0bf].
Constatei meu erro ao ler a documentação do Delphi e após umas ´olhadas´ no código fonte da VCL. ;-)
Bom, corrigido! :-D
[]´s[b:a0d3eef0bf][/b:a0d3eef0bf][/quote:a0d3eef0bf]
Blz Michael, pelo menos vc retificou a informação prestada, valew!!!
17/02/2006
Marco Salles
primeiro quero deixar claro que não sou e ne pretendo ser formador de opinões ... Apenas tento ser passador de informaçoes
Segue :
tirado do tópico : http://forum.devmedia.com.br/viewtopic.php?t=69850&highlight=exitprocess&sid=ad15ebb96ab9aaa0997294d3c29ab240
[b:b4368d2f50]Naquele tópico o vitor^_^ , inicia assim sua postagem :[/b:b4368d2f50]
Portanto, halt não seria apropriado para usar no meio de um programa, mas sim no caso de uma excessão no tratamento de excessoes, e mesmo assim podem ser usados outros métodos.
Se o programa não usa o objeto global application, por exemplo um programa console de loop infinito, pode-se usar o halt numa exception mas o programa ´Sai´ normalmente com um simples exit; no corpo da procedure principal do programa;
se o programa usa units com o objeto global application, pode-se usar o application.terminate. Este método funciona assim: ele chama uma lista encadeada de funções booleanas de término, executa todas e se todas retornaram true, ele executa a função de api PostQuitMessage(0); Colocando assim uma mensagem de erro zero na saida para o sistema operacional. Esse método pra terminar o programa é muito bom, mas ele tem uns probleminhas: primeiro ele termina de criar o programa inteiro, para depois terminá-lo. Isso no caso de um datamodule seria causa de vários erros se fosse executado durante o create do datamodule. Isso também dá tela azul. Um outro problema do Terminate é a lista encadeada de functions booleanas que ele executa. Geralmente a lista está vazia, mas se tiver alguma, e esta retornar false, a aplicação não termina. O terceiro problema é o seguinte: as forms e objetos filhos só são liberadas da memória no evento onclose se a closeaction for do tipo cafree, ou se é executado um release. Se todas as forms estiverem fechadas e a principal é fechada, ela é liberada e o terminate é executado automaticamente. Mas se o terminate é executado direto, deixa a memória suja, porque não libera os objetos da memoria.
Existe uma função da api do windows que termina um programa ou processo imediatamente, sem nenhum erro ou tela azul, que é o exitprocess(0); É o mais silencioso de todos, mas mantém a memória suja, porque não destroi ou libera nenhum objeto ou form. Mas faz o que tem que fazer, que é colocar o valor 0 no registrador EAX do processador. O que fazer então? Qual a melhor forma de liberar um programa da memória de maneira limpa?[/quote:b4368d2f50]
A resposta é: Código: self.free; //usado somente se estiver dentro de uma form ou datamodule application.free; //se o objeto application estiver disponível; exitprocess(0); //por último, pra finalizar.
a pergunta é ::: como o próprio vitor^^ descreveu no tópico postado por ele
[color=red:b4368d2f50]O que voces acham ou pensam...[/color:b4368d2f50]
20/02/2006
Michael
Eu pensava a mesma coisa sobre o [b:93568a241c]Halt[/b:93568a241c], até tirar a prova dos 9: Criei uma classe derivada de [b:93568a241c]TComponent[/b:93568a241c], a instanciei colocando o Form como [b:93568a241c]Owner[/b:93568a241c], sobrescrevi o destrutor e coloquei um breakpoint dentro dele. Da mesma forma que implementei o evento [b:93568a241c]OnDestroy[/b:93568a241c] do form. Executei o programa e chamei [b:93568a241c]Halt[/b:93568a241c]. Os dois breakpoints foram executados, o que significa que os destrutores das classes foram corretamente avaliados e tudo liberado da memória.
Além disso, foi o que eu citei no último post: qdo um programa termina o sistema operacional libera toda a memória que foi disponibilizada para ele. Mesmo que objetos não sejam explicitamente destruídos, o SO o fará posteriormente. Mesmo assim eu não aconselho a ninguém confiar plenamente nisso mas sim sempre liberar os objetos que forem criados manualmente.
Do mais, não se deve dar [b:93568a241c]Free[/b:93568a241c] no objeto Application, pela simples razão de ele não ter sido criado pelo programador, e sim pelo Delphi. Fazendo isso corre-se o risco de o Delphi usar o objeto posteriormente e ele não existir mais, resultado em um AV. E tbm não se o form for o principal, usa-se Close, que engatilha Application.Terminate nos bastidores.
[]´s
20/02/2006
Marco Salles
eu so descrevi aquilo que ele passou.. Abre Aspas e fecha Aspas diga-se de passagem
A minha opinião pessoal é que as pessoas querem uma receita de bolo acreditando que existe alguma invalivel.. Hora se entre os tres processos , uma for invalivel , então as outra duas são lixo , o que acredito não ser verdade.
estes processos muitas das vezes depende de como esses forms foram criados e como eles sao construidos...
quanto a essa afirmação , eu acho que se este aplication.free for dado no formulario principal não se obtera erro e usar o onclose não procede porque estamos falando de interrupçoes bruscas....
20/02/2006
Michael
eu so descrevi aquilo que ele passou.. Abre Aspas e fecha Aspas diga-se de passagem[/quote:1eb04df937]
Deixando de lado a ironia, a última frase do post é:
[color=red:1eb04df937]O que voces acham ou pensam...[/color:1eb04df937]
Presumo que foi o nobre colega quem escreveu isso.
[quote:1eb04df937=´Marcos Salles´]A minha opinião pessoal é que as pessoas querem uma receita de bolo acreditando que existe alguma invalivel.. Hora se entre os tres processos , uma for invalivel , então as outra duas são lixo , o que acredito não ser verdade.
estes processos muitas das vezes depende de como esses forms foram criados e como eles sao construidos...[/quote:1eb04df937]
Concordo. Cada caso é um caso.
[quote:1eb04df937=´Marcos Salles´]quanto a essa afirmação , eu acho que se este aplication.free for dado no formulario principal não se obtera erro e usar o onclose não procede porque estamos falando de interrupçoes bruscas....[/quote:1eb04df937]
A regra geral é que só devemos destruir o que foi criado por nós. Como o a variável global Application é inicializa pela aplicação, ela é a responsável por desalocá-la. Mesmo assim chamar Free apenas não vai interromper a execução da aplicação. Creio q deva apenas destruir os forms abertos.
Este post começou perguntando o que era melhor entre Halt, Close ou Application.Terminate. Não foi questionado sobre como terminar uma aplicação bruscamente. Em todo caso, pode-se usar a API TerminateProcess, que o Windows usa para fechar um processo instantaneamente, ou a própria ExitProcess citada inicialmente por vc. É importante notar que ambas as API´s não respeitarão os destrutores dos objetos criados, conseqüentemente eventos como OnDestroy não serão executados. Isso pode ser crítico qdo o código neles for essencial para algum processo.
[]´s
20/02/2006
Marco Salles
isto foi so para reafirmar a posição .. Ja que quando o Vitto_^^ postou o seu topico , ninguem achou nada;; Eu quis é enfatizar o que ele perguntou
eu que imaginei que o colega PauloSowfatare estava mencionado sobre : [b:49fd0ff014]qual o melhor método de se finalizar bruscamente um programa[/b:49fd0ff014].. E ainda continuo achando que esta era a sua idéia original...Se não for o caso de terminar bruscamente , acho que o[b:49fd0ff014] Rjun [/b:49fd0ff014]ja tinha respondido :
como o PaullSoftware rebateu esta afirmação , como se pode ver a seguir :
[b:49fd0ff014]Citaçao de PaullSoftware[/b:49fd0ff014]
eu então que inicializei esta diferença :
Pera ai
[b:49fd0ff014]Citação de Marco salles[/b:49fd0ff014]
e fim.........
mas foi isso que no seu tópico o Vitor_^^ descreveu :
como regra sim..
eu não quis dizer isto.. Quis dizer que se voce estiver dentro do formPrincipal e quizer terminar bruscamente um programa , dentro daquilo que o vitor_^^ propos pode-se usar Application.free seguido de ExitProcess(0);
no mais é isso ai ..conhecer os métodos sua limitaçoes e aplica-los corretamente em cada situações..
Clique aqui para fazer login e interagir na Comunidade :)