IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Comment fermer proprement une application grâce au code


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 150
    Points : 51
    Points
    51
    Par défaut Comment fermer proprement une application grâce au code
    Bonjour à tous,

    J'ai fait une application sous Delphi, seul problème c'est que celle-ci est très lourde car il y a beaucoup d'images et de panels... Mon application fait 1 657 Ko et quand je souhaite fermer celle-ci avec la petite croix rouge de Windows, elle se ferme mais au bout de quelques minutes... J'aimerai qu'elle se ferme vraiment et vite avec une action dans le code. Je pensais à un sleep puis un close sur l'evenement on close de la form mais ça ne résout pas mon problème

    Un peu d'aide s'il vous plait ?

    Merci d'avance !

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Le sleep ralentira la fermeture, puisqu'il "bloquera" l'application.
    Si ton application met du temps à se fermer, soit elle est vraiment très lourde en mémoire, soit à la fermeture elle a des actions consommatrices de temps. (par exemple des commit de bases de données, des écritures sur disques).

    Pour la taille, 1657ko, qui est je suppose la taille sur le disque, ça ne veut rien dire. regarde la taille que ton application prend en mémoire.

    Pour informations des applications de 100 Mo en mémoire se ferment instantanément s'il n y a pas de traitement en attente.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 150
    Points : 51
    Points
    51
    Par défaut
    La taille que mon application prend en mémoire ? Je vois ça dans le gestionnaire des taches ? Dans l'onglet processus ?
    Si c'est ça elle prends 10 124 K en mémoire...

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    Citation Envoyé par Kuneru Voir le message
    Mon application fait 1 657 Ko
    Minuscule, j'ai des EXE de plus de 40Mo sous XE2 !
    Heureusement que UPX soit là !
    Même avec les thèmes l'IHM ne souffre d'aucun ralentissement alors qu'il y a justement beaucoup d'image et de dessin lié au Thème !

    10Mo en RAM, encore une fois, c'est très faible !

    Je pense comme Linkin qu'un traitement de Base de données ralenti ton programme, ou même un simple fichier (genre un gros SaveToFile)
    C'est aussi si des boucles qui trainent (thread ?) ou alors des TTimer contenant Application.ProcessMessages ce qui est très maladroit !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 150
    Points : 51
    Points
    51
    Par défaut
    En effet, j'ai les 3 ! Le traitement de Base de données (je parcours une table ou je récupère des données que j'affiche dans un listView) puis des boucles While, car mon programme tourne constamment, il met à jour le tableau en fonctions des données sélectionnées au bout d'un certain temps, mon Timer où oui je crois avoir des Application.ProcessMessages...

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    Retire les application.ProcessMessage du OnTimer, cela peut provoquer une ré-entrance (une sorte de récursivité)
    Tu peux éviter cela en passant Enabled à False au début et si besoin rétablir à True à la fin !

    Ton Timer est-il pour Refresh régulier genre actualisation par rapport au serveur pour combler des accès concurrentie par d'autres instances du programme ?
    Ou juste un retardeur pour ne pas lancer les requêtes à chaque frappe, un peu comme le ChangeDelay du TTreeView ?

    Si c'est un Refresh, peut-être que tenter un thread qui lit les données, les place dans un tampon d'écriture
    soit un Tampon via une TThreadList
    soit via un système tampon permuté genre DoubleBuffered\TripleBuffered, cette technique plutôt vidéo peut s'appliquer à l'affichage quasi-temps réel d'une DB
    La Fenêtre contient toujours un Timer qui ne fait que lire ce tampon ou alors un via une notification (j'ai écrit un truc du genre déjà sur le forum)


    Si c'est un retardeur, tu peux repasser Enabled à False dès le début !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 376
    Points
    20 376
    Par défaut
    bonjour,

    1 je déconseille totalement une utilisation abusive de Threads dans une application c'est déjà un premier point.
    Les threads c'est totalement à bannir tant que le projet n'est pas finalisé.
    Une fois que le projet est bien finalisé , qu'il est bien fonctionnel , tu peux passer à l'utilisation de threads mais il faut savoir les utiliser intelligemment

    2 ensuite si ton projet est trop lourd et rame à l'exécution c'est que tu charges trop de formulaires et ça finit par grignoter de la mémoire.
    Donc une solution c'est de charger et décharger les formulaires à la demande

    3 il faut procéder si possible à une refactorisation totale du projet bref à essayer de trouver les dénominateurs communs dans l'architecture du projet,les classes etc..
    si tu as 2 TForms qui font quasiment la même chose et qui ont quasiment les mêmes composants alors il est peut-être judicieux de créer une classe de base et gérer des classes héritées pour éviter les redondances

    Ensuite au niveau du code il faut éviter un maximum les copier-coller ; si tu as des paquets de code qui font la même chose il faut optimiser un maximum en écrivant de procédures qui simplifient les choses ou au besoin utiliser les mécanismes de la POO

    4 les images: ça consomme énormément de ressources surtout si la profondeur de pixels est élevée ( 24bits) donc plutôt que de les lier à l'exécutable, créer une dll et charger les images à la demande

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Février 2014
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 150
    Points : 51
    Points
    51
    Par défaut
    Merci à vous pour tous ces conseils !
    J'ai résolu mon problème en sortant de mon While. Je m'explique, lors du OnClose de la forme, je donne à ma variable cpt une valeur que ma condition While n'attendra jamais, du coup il termine sa boucle et s'arrete et ferme le programme !
    Je passe de 1min30 à 8sec entre le clic sur la croix et la fermeture de l'application !

    Un dessin vaut mieux qu'un long discours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    cpt:=0;                                                                      
     
      While cpt<= fournisseurs.Count-1 do
    --------------------------------------------------
    suite du wile
    end;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    cpt:=200;
    end;
     
    end.

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    J'éviterai (et je dirais même, je bannirais) cette méthode. Imagine pour une quelconque raison que le nombre de fournisseurs dépasse les 200! Après tout, on ne saura jamais si ce "chiffre magique" sera atteints ou non!

    Je te conseille de créer un booléen qui représente la demande de fermeture de l'application, et donc, qui arrêtera ton While lorsque tu vérifieras ce booléen.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if mustCloseApp = false then
    begin
      cpt:=0;                                                                      
        While cpt<= fournisseurs.Count-1 do
      --------------------------------------------------
      suite du wile
      end;
      end;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      mustCloseApp := true;
    end;
     
    end.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    N'est-ce pas plus plutôt ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      cpt:=0;                                                                      
        While (cpt<= fournisseurs.Count-1) and not mustCloseApp do
      --------------------------------------------------
      suite du wile
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    En effet, c'est beaucoup plus élégant ainsi !!! Je m'étais surtout penché sur le "chiffre magique" 200. Mais j'avoue, autant faire bien jusqu'au bout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment fermer proprement une application avec map
    Par alex8276 dans le forum Android
    Réponses: 4
    Dernier message: 30/04/2015, 16h09
  2. Réponses: 0
    Dernier message: 10/09/2010, 17h30
  3. Comment fermer proprement une fenetre?
    Par dams95190 dans le forum VBA Access
    Réponses: 13
    Dernier message: 12/10/2007, 13h45
  4. [C] Comment arreter proprement une application ?
    Par Hikage dans le forum Windows
    Réponses: 6
    Dernier message: 05/07/2006, 10h29
  5. [wxPython][wxFrame]Comment fermer proprement une frame ?
    Par Screameur dans le forum wxPython
    Réponses: 4
    Dernier message: 12/05/2005, 19h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo