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 :

Le processus reste en mémoire


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut Le processus reste en mémoire
    Bonjour à tous,
    je travaille sur un projet multi-thread contenant un activeX.
    De temps en temps, un problème ennuyant survient, le processus de l'application reste en mémoire, pourtant aucun message d'erreur n'est survenu à la fermeture de celle-ci.
    Je me demande s'il existerait une méthode pour s'assurer de la terminaison de l'application... qui permettrait de s'assurer que le processus n'est pas resté en mémoire...
    voici le code d'exécution de l'application :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    begin
      CoInitialize(nil);  // Initialization de la librairie 
      CoInitializeSecurity(nil, -1, nil, nil, RPC_C_AUTHN_LEVEL_NONE,
                           RPC_C_IMP_LEVEL_IMPERSONATE, nil, EOAC_NONE, nil);
      Application.Initialize;
     
      Parametres:=TParametresProgramme.Create;
      Repartiteur:=TRepartiteur.Create;
      MainThreadRepartiteur:=TRepartiteurThreadPrincipal.Create(Repartiteur);
     
      UtilisateurEnCours:=TUtilisateur.Create(LireUserName);
      Trace:=TTraceur.Create(UtilisateurEnCours.LogsFile);
     
      Application.ShowMainForm:=True;
      Application.Title:='xxxxxx';
      Application.CreateForm(TMainFrm, MainFrm);
      Application.CreateForm(TfrmChoixFormat, frmChoixFormat);
      Application.Run;
     
      if Assigned(Trace) then begin
        Trace.EmpileChaine('Fin de l''application.');
        Trace.ViderBuffer;
      end;
     
      if Assigned(MainThreadRepartiteur) then begin
        FreeAndNil(MainThreadRepartiteur);
      end;
     
      if Assigned(Repartiteur) then begin
        Repartiteur.Terminate;
        Repartiteur.Resume;
        FreeAndNil(Repartiteur);
      end;
     
      if Assigned(Trace) then begin
        {$IFDEF DEBUG}
        Trace.EmpileChaine('Finfin OK.');
        {$ENDIF}
        Trace.EmpileChaine('-------------------------------------------------------');
        Trace.EmpileChaine('');
        Trace.ViderBuffer;
      end;
     
      application.ProcessMessages;
     
      CoUninitialize;
      OleUninitialize();
      Application.Terminate;
      end.
    toute suggestion est la bienvenue !

    Merci par avance.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    peut-être faut-il détruire manuellement tout les Threads que tu créé pour que l'application se libère en mémoire.

    Autre piste, est-ce que tu ouvres des applications via OLE (Word, Excel, etc...) ça pourrait éventuellement être une cause, si tu ne les fermes pas explicitement mais là je ne suis pas sûr.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Est-tu sûr qu'il ne vaut pas mieux utiliser CoInitializeEx et spécifier un modèle de threading adapté à ton appli (si toutefois ton activex est utilisé depuis des threads). De plus, il me semble que cette initialisation est effectuée par Delphi quand tu inclues l'unité ActiveX, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if Assigned(MainThreadRepartiteur) then begin
        FreeAndNil(MainThreadRepartiteur);
      end;
    Le thread est arrêté, ou tu te contentes de libérer l'objet sans vérifier si le fil est stoppé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if Assigned(Repartiteur) then begin
        Repartiteur.Terminate;
        Repartiteur.Resume;
        FreeAndNil(Repartiteur);
      end;
    Je ne comprends pas : tu demandes l'arrêt du thread puis tu le relances... A mon avis, Resume() est à remplacer par WaitFor().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.ProcessMessages;
    Inutile à cet endroit et générateur de deadlocks, je supprimerais.

    Idem : inutile et dangereux à ce point, je supprimerais aussi.
    "It's more fun to compute !"

  4. #4
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci pour ces réponses constructives.
    Je réalise quelques tests et vous tiens au courant.

Discussions similaires

  1. [WD12] Application ferme mais processus reste
    Par Xsara 167 cv dans le forum WinDev
    Réponses: 12
    Dernier message: 14/04/2008, 11h00
  2. Application reste en mémoire
    Par vrachid dans le forum Langage
    Réponses: 3
    Dernier message: 22/01/2008, 16h00
  3. Réponses: 11
    Dernier message: 20/09/2007, 13h31
  4. Réponses: 10
    Dernier message: 13/02/2006, 08h30
  5. Réponses: 4
    Dernier message: 30/08/2005, 12h59

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