Fórum metodos de se terminar um programa #300822
26/10/2005
0
o pessoal com mais experiência, Por favor, se tiver algum erro no texto abaixo, me corrijam pls ^^
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 [b:5eacf92fc8]halt[/b:5eacf92fc8]. 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´.
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 [b:5eacf92fc8]exit;[/b:5eacf92fc8] no corpo da procedure principal do programa;
se o programa usa units com o objeto global application, pode-se usar o [b:5eacf92fc8]application.terminate[/b:5eacf92fc8]. 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?
A resposta é:
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.
Espero que tenha sido util
Vitor Luiz Rubio ^^
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 [b:5eacf92fc8]halt[/b:5eacf92fc8]. 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´.
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 [b:5eacf92fc8]exit;[/b:5eacf92fc8] no corpo da procedure principal do programa;
se o programa usa units com o objeto global application, pode-se usar o [b:5eacf92fc8]application.terminate[/b:5eacf92fc8]. 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?
A resposta é:
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.
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.
Espero que tenha sido util
Vitor Luiz Rubio ^^
Vitor Rubio
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)