Array
(
)

Halt(0); ou Application.Terminate???

Paullsoftware
   - 09 fev 2006

como diz o título qual a melhor opção?


Rjun
   - 09 fev 2006

Nenhuma. Use o Close do seu form principal.


Paullsoftware
   - 09 fev 2006


Citação:
Nenhuma. Use o Close do seu form principal.

simples assim... então pra que existem essas opções!


Cabelo
   - 09 fev 2006

Se não me engano...

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.


Marco Salles
   - 09 fev 2006

Pera ai

Uma coisa é finalizar a aplicação outra coisa e forçar com que a aplicação feche imediatamente...


Marco Salles
   - 09 fev 2006


Citação:
Pera ai

Uma coisa é finalizar a aplicação outra coisa e forçar com que a aplicação feche imediatamente...


desculpe , esta ultima colocaçao para o PaullSoftware


Citação:
simples assim... então pra que existem essas opções!


e não tem relação com a resposta do cabelo

Com relação a resposta do cabelo


Citação:

Se não me engano...

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...


Acho que não procede isto..


Rjun
   - 09 fev 2006

Halt ou Terminate server para interrromper a execução do aplicativo. Se você quer terminar a execução, tipo um menu close, utilize o close do seu form principal.

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.


Michael
   - 09 fev 2006

Existem diferenças não-triviais entre o método Terminate e Halt.

Halt 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 ExitCode retornado ao sistema operacional, e não tem relação com a quantidade de forms abertos.

Terminate fecha a aplicação, assegurando que tudo que foi alocado seja liberado. Em outras palavras, chama o método Free para todos os componentes, que chamarão Free para os componentes que são seus ´filhos´ (definidos através do parâmetro Owner no construtor). Também dispara uma mensagem para o Windows, para garantir que tudo seja destruído na ordem certa. Por essa razão Terminate pode demorar alguns segundos para fechar a aplicação, enquanto Halt é imediato.

Existe a propriedade Terminated, da classe TApplication, 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 Close da classe TCustomForm chama Application.Terminate caso o formulário seja o MainForm da aplicação. Portanto, ambos têm o mesmo efeito nesse caso.

Portanto, na maioria dos casos, use Terminate ou Close, se o form for o principal.


Marco Salles
   - 09 fev 2006

ainda tem o exitprocess(0) que é uma função da api do Windows


Paullsoftware
   - 17 fev 2006

Valeu galera as declarações e esclarecimento aqui encontradas foram de grande ajuda...

abraço a todos... :lol:


Michael
   - 17 fev 2006

Caros colegas,

Gostaria de retificar algo que afirmei em meu último post neste tópico:


Citação:
Halt fecha a aplicação de forma anormal, não liberando a memória alocada pelos objetos, recursos consumidos, etc. (...)


Isso não está correto. Ao contrário do que falei, Halt respeita os objetos criados pela aplicação, que tenha sido inicializados com o parâmetro Owner apontando para algo gerenciado pelo aplicativo, como o formulário principal. Desta forma chamar Halt 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 Terminate.

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


Martins
   - 17 fev 2006


Citação:
Caros colegas,

Gostaria de retificar algo que afirmei em meu último post neste tópico:


Citação:
Halt fecha a aplicação de forma anormal, não liberando a memória alocada pelos objetos, recursos consumidos, etc. (...)


Isso não está correto. Ao contrário do que falei, Halt respeita os objetos criados pela aplicação, que tenha sido inicializados com o parâmetro Owner apontando para algo gerenciado pelo aplicativo, como o formulário principal. Desta forma chamar Halt 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 Terminate.

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


Blz Michael, pelo menos vc retificou a informação prestada, valew!!!


Marco Salles
   - 17 fev 2006

vamos colocar mais pimenta nesse tópico :lol: :lol: :lol:

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


Naquele tópico o vitor^_^ , inicia assim sua postagem :


Citação:
[size=18:b4368d2f50]o pessoal com mais experiência, Por favor, se tiver algum erro no texto abaixo, me corrijam pls ^^ [/size:b4368d2f50]



Citação:
Há varios métodos de se terminar um programa.

Para se criar uma saída ou terminação anormal no programa nós geralmente usamos a procedure halt. mas essa procedure dá varios erros porque ela passa um código de erro ao sistema operacional. Além disso, os passos da procedure logo após ela são executados, porque a procedure que a chamou retorna à sua propria procedure chamadora. talvez até tente mexer com objetos que deveriam estar destruidos. Isso que cria aquele monte de janelas de erro e aquele erro de ´enviar relatorio´ no windows XP. No windows 98 isso causa a paralização do sistema com uma ´tela azul´.


Citação:
Um outro problema do halt é que ele não destroi objetos, não dá free em nada, deixando a memória do windows ´Suja´.


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?


#Código

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.




Citação:
nessa ordem é garantido que ele limpa a memória, não dá tela azul e nem assusta o usuario. isso é o que pode ser usado naquelas exceptions mais ferradas, quando o programa não pode ser fechado ou finalizado normalmente mas tem que ser fechado de repente.


a pergunta é ::: como o próprio vitor^^ descreveu no tópico postado por ele


Citação:
[size=18:b4368d2f50]o pessoal com mais experiência, Por favor, se tiver algum erro no texto abaixo, me corrijam pls ^^ [/size:b4368d2f50]


O que voces acham ou pensam...


Michael
   - 20 fev 2006

Olá!

Eu pensava a mesma coisa sobre o Halt, até tirar a prova dos 9: Criei uma classe derivada de TComponent, a instanciei colocando o Form como Owner, sobrescrevi o destrutor e coloquei um breakpoint dentro dele. Da mesma forma que implementei o evento OnDestroy do form. Executei o programa e chamei Halt. 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 Free 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


Marco Salles
   - 20 fev 2006

este ultimo post não foi colocado por mim , mas sim pelo amigo vitor^_^
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...


Citação:
Do mais, não se deve dar Free 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.


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....


Michael
   - 20 fev 2006


Citação:
este ultimo post não foi colocado por mim , mas sim pelo amigo vitor^_^
eu so descrevi aquilo que ele passou.. Abre Aspas e fecha Aspas diga-se de passagem


Deixando de lado a ironia, a última frase do post é:

O que voces acham ou pensam...

Presumo que foi o nobre colega quem escreveu isso.


Citação:
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...


Concordo. Cada caso é um caso.


Citação:
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....


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


Marco Salles
   - 20 fev 2006


Citação:
Deixando de lado a ironia, a última frase do post é:

O que voces acham ou pensam...


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


Citação:
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.


eu que imaginei que o colega PauloSowfatare estava mencionado sobre : qual o melhor método de se finalizar bruscamente um programa.. E ainda continuo achando que esta era a sua idéia original...Se não for o caso de terminar bruscamente , acho que o Rjun ja tinha respondido :


Citação:
Acompanhe os trechos inicais do diálogo:

Citação de Rjun

Citação:
Nenhuma. Use o Close do seu form principal.


como o PaullSoftware rebateu esta afirmação , como se pode ver a seguir :

Citaçao de PaullSoftware

Citação:
Como o Rjun escreveu:
Nenhuma. Use o Close do seu form principal.

simples assim... então pra que existem essas opções!


eu então que inicializei esta diferença :

Pera ai

Citação de Marco salles

Citação:
Uma coisa é finalizar a aplicação outra coisa e forçar com que a aplicação feche imediatamente...


e fim.........


Citação:
É importante notar que ambas as API´s não respeitarão os destrutores dos objetos criados


mas foi isso que no seu tópico o Vitor_^^ descreveu :

Citação:
´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. ´



Citação:
A regra geral é que só devemos destruir o que foi criado por nós.


como regra sim..


Citação:
Mesmo assim chamar Free apenas não vai interromper a execução da aplicação. Creio q deva apenas destruir os forms abertos.


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..