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 :

Application reste active après fermeture de la fiche principale


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut Application reste active après fermeture de la fiche principale
    Bonjour et bonne année à tous,

    Mon application ouvre une fiche principale qui ouvre une 2ème fiche après avoir caché la première.
    L'événement OnClose de cette deuxième fiche ferme la fiche principale et l'application se ferme.
    Depuis que j'ai placé une procédure de la 2ème fiche dans un thread, toutes les fiches se ferment mais l'application reste active.

    Voici comment je procède :
    Dans l'évènement OnCloseQuery de la Fiche 2, je suspends l'exécution du thread et je demande si l'utilisateur veut arrêter le processus en cours.
    Si oui, je termine le Thread et je mets CanClose à true, sinon, je "resume" le thread et je mets CanClose à False et dans ce cas l'application se poursuit.

    Si l'utilisateur veut fermer l'application (réponse oui), je constate que les évènements OnClose des 2 fiches s'exécutent mais pas les évènements OnDestroy et l'application reste active.

    A quoi est-ce dû ?

    Merci à toute suggestion.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 616
    Points : 25 311
    Points
    25 311
    Par défaut
    tu termines le Thread de quel manière, Terminated := True ?
    Et dans ton Thread tu test Terminated en boucle ?
    As-tu un WaitFor ? il me semble que le destructor de Thread contient un WaitFor qui attend que la fonction Execute soit terminé !

  3. #3
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 291
    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 291
    Points : 1 942
    Points
    1 942
    Par défaut
    Libères-tu bien le Thread? (par un free ou avec FreeOnTerminate à true)

  4. #4
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Je dois reconnaître que je débute avec les Threads mais j'en ai un qui ne pose pas de problème.

    j'appelle le Thread de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMainForm.ImportBtnClick(Sender: TObject);
    Begin
      FillData := TLoadData.Create(True); 
      FillData.Resume;  
    end;
    Si l'utilisateur veut fermer l'application alors que le Thread n'est pas terminé, il en est prévenu par :
    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
    procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    Var
      Answ : Integer;
    begin
      if (Assigned(FillData)) and (Not FillData.ThreadTerminated) then
      begin
        FillData.Suspend;
        Answ := MessageBox(0,PChar('Le chargement des données est en cours.' + #13#13 + 'Voulez-vous vraiment mettre fin à l''application'), 'CadaCom',
                           Mb_YesNo or MB_ICONInformation);
        if Answ = ID_No then
        begin
           CanClose := False;
           FillData.Resume;
        end
                        else
           begin
             FillData.Terminate;
             CanClose := True;
           end;
      end;
    end;
    Le Thread est créé comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Constructor TLoadData.Create(Suspended : Boolean);
    begin
      FreeOnTerminate := True;
      Inherited Create(Suspended);
      OnTerminate := OnTerminateProcedure;
      ThreadTerminated := False;
    end;
    ThreadTerminated est mis à True dans l'évènement OnTerminate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure TLoadData.OnTerminateProcedure(Sender : TObject);
    begin
      ThreadTerminated := True;
    end;
    A l'exécution, le Thread copie des données alphanumériques et des Shapefiles après un traitement qui dure plusieurs minutes.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 465
    Points
    13 465
    Par défaut
    Il faut savoir que pour qu'un thread soit libéré, il doit être en exécution. C'est le premier contrôle qui est fait à sa destruction. Ton thread démarre simplement son exécution normal.
    D'où la necessité de tester souvent Terminated

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 616
    Points : 25 311
    Points
    25 311
    Par défaut
    Effectivement, il ne faut pas susprendre ! Cela ne sert strictement à rien !

    Voici un code plus court et fonctionnel !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      if (Assigned(FillData)) and (Not FillData.ThreadTerminated) then
      begin
        CanClose := MessageDlg('Le chargement des données est en cours.' + #13#13 + 'Voulez-vous vraiment mettre fin à l''application', mtConfirmation, [mbYes, mbNo], 0) = mrYes; // Attention ne pas mélanger Dialogs et QDialogs !              
       if CanClose then 
         FillData.Terminate();
      end;
    end;
    Attention FillData peut être libéré par FreeOnTerminate sans mise à null, si tu utilises un seul Thread, tu devrais passer par un singleton qui se met à nil lors de la destruction de l'instance.

  7. #7
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'ai utilisé suspend parce qu'il me paraissait peu sympa de voir le thread continuer avec une ProgressBar qui continue a augmenter alors que l'utilisateur a fermé la fenêtre qui exécutait le Thread, ce qui exprime sa volonté de fermer cette fenêtre.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 616
    Points : 25 311
    Points
    25 311
    Par défaut
    Ben, suffisait cacher la ProgressBar durant le OnCloseQuery !

  9. #9
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Ok Merci ShaiLeTroll.

    J'ai mis la propriété visible de la fiche qui contient la barre de progression à False au lieu d'utiliser Suspend.

    Cependant si je réexecute le Thread pour charger de nouvelles données, la fiche de la barre de progression apparait vide. Et parfois le threads se déroule normalement (sauf qu'on ne visualise pas sa progression), parfois, cela plante sur une erreur SQL.

  10. #10
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'avais des instructions relatives à la fiche dans la procedure Execute.
    J'ai tout mis dans une procedure distincte avec laquelle j'exécute un Synchronize.

    Tout est parfait et la vie est belle.

    Merci à tous

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

Discussions similaires

  1. Checkbox reste checked après fermeture popup
    Par jules_diedhiou dans le forum jQuery
    Réponses: 9
    Dernier message: 19/09/2014, 14h43
  2. [XL-2010] VBAPROJECT reste ouvert après fermeture du fichier
    Par Oliv- dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/04/2014, 16h01
  3. Réponses: 11
    Dernier message: 07/06/2007, 15h21
  4. Forcer de tuer un process après fermeture d'une applic!
    Par _shuriken_ dans le forum Windows XP
    Réponses: 14
    Dernier message: 26/01/2007, 15h27
  5. [VB]fichier XL reste verrouillé apres fermeture application
    Par abdou.sahraoui dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/01/2006, 14h34

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