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

C++Builder Discussion :

Fermeture avec traitement long dans le onActivate [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut Fermeture avec traitement long dans le onActivate
    Bonjour,

    Je réalise actuellement une application qui traite un grand nombre de données dans une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void maFenetre:FormActivate(TObject *Sender)
    {
       for(int i=0;i<10000;i++)
       {
           (...)
           Application->ProcessMessages(); // pour que ça ne reste pas bloqué !
       }
    }
    Or je souhaiterais que lors d'un clic de la souris sur la croix de la fermeture de la fenêtre, celle-ci stoppe ma boucle (via un booléen) et ferme la fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void maFenetre:FormActivate(TObject *Sender)
    {
       stop = false;
       for(int i=0;(i<10000)&&(!stop);i++)
       {
           (...)
           Application->ProcessMessages(); // pour que ça ne reste pas bloqué !
       }
    }
    Mais j'ai beau mettre "stop=true;" dans l'événement "OnClose" ou dans l'événement "OnCloseQuery" de ma fenêtre, cela ne fonctionne pas, elle ne ferme la fenêtre qu'à la fin de ma boucle... Que faire ?

    Merci par avance !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Je ne m y connais pas bcp mais je pense que le temps que tu cliques sur la croix pr sortir , ton application a eu largement le temps de faire tourner ta boucle jusqu au bout .... Mais bon j'ai pt pas bien compris ton problème ...

  3. #3
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Non non, ma boucle tourne toujours
    Dans les (...) il y a du code que j'ai omis volontairement ici

  4. #4
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ta variable est défini en global ???

  5. #5
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Oui, ma variable "stop" est définie en global dans la déclaration de "maFenetre".

    Le blocage vient peut-être du fait que la boucle est dans l'événement OnActivate... mais je suis obligé de mettre cette boucle là-dedans, car il s'agit de l'affichage d'une liste à l'ouverture de la fenetre.

  6. #6
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    En C++ il existe une fonction CanClose qui permet de dire si oui ou non on peut fermer l'application. Mais le truc c'est que je sais pas si elle existe sous Builder.*

    SInon je pense à un truc mais ca risque d'être long :
    -> Détecter un clic sur le position de la croix
    -> Faire un break de ta boucle et fermer l'application

  7. #7
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    c'est la chose à laquelle j'avais pensé mais malheureusement, l'événement "onmousemove" ne fonctionne que lorsque la souris est SUR la fenêtre, mais pas sur la barre de titre de la fenêtre (qui contient les boutons croix, agrandissement, etc...)

  8. #8
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    C'est bizarre je vient de faire un truc comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       stop = false;
       for(int i=0;(i<10000)&&(!stop);i++)
       {
           Edit1->Text = i;
           Application->ProcessMessages(); // pour que ça ne reste pas bloqué !
       }
    }
    void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
    {
    stop = true;
    }
    Et ma fenetre se ferme correctement avant la fin du processus

  9. #9
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    oui, cet exemple fonctionne aussi pour moi... sauf que je n'utilise pas ma boucle dans un événement Button1Click, mais dans l'événément OnActivate de la fenêtre, et je pense que c'est cela qui coince !

  10. #10
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Surement que tu ne dois pas pouvoir lancer OnClose tant que OnActivate ne s'est pas terminé! Doit y avoir un mécanisme de "sécurité" qui est peut être désactivable !

    Bon courage :o

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello

    Et en utilisant un composant ApplicationEvents et OnIdle??
    Essaye de mettre le code de ton FormActivate dans ApplicationEvents->OnIdle, en faisant en sorte que le OnIdle ne s'exécute qu'une fois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
    {
      ApplicationEvents1->OnIdle = NULL;
      stop = false;
      for(int i=0;(i<10000)&&(!stop);i++)
      {
          (...);
          Application->ProcessMessages(); // pour que ça ne reste pas bloqué !
      }
    }

  12. #12
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Ca pourrait fonctionner avec la méthode du OnIdle, mais apparemment ça marche un coup, puis après ça ne fonctionne plus correctement... je vais essayer de chercher davantage dans ce sens...

    Merci pour l'idée !

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Tu as besoin de refaire ta boucle par la suite (en repassant par le ApplicationEvents1Idle) ??
    Si c'est le cas, dès que tu en as besoin, fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ApplicationEvents1->OnIdle = ApplicationEvents1Idle;

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 89
    Points : 90
    Points
    90
    Par défaut
    C'est peut-être une connerie, mais pourquoi pas faire un thread que tu lance dans ton FormActivate et que tu stop depuis ton FormCloseQuery?
    Je trouve ca plus 'propre', non?

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 51
    Points : 53
    Points
    53
    Par défaut
    Le problème vient certainement de l'évènement OnActivate, car il se déclenche à chaque fois que la fenêtre a le focus si j'ai bien compris ça :

    Extrait de l'aide de BDS 2006 :
    Class
    TCustomForm

    Syntax
    [C++] __property TNotifyEvent OnActivate = {read=FOnActivate, write=FOnActivate};

    Description
    Use OnActivate to perform special processing when the form receives focus. A form becomes active when focus is transferred to it (when the user clicks on the form, for example).
    Du coup je pense que quand tu cliques c'est d'abord cet évenement qui se déclenche et stop reste à false...
    Tu peux peut-être le vérifier avec de bêtes ShowMessage dans les 2 évenements, et voir lequel se déclenche ?

Discussions similaires

  1. [AC-2003] Importation d'un fichier excel dans Access avec traitement
    Par Mishe dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/03/2013, 16h23
  2. Traitement Ajax dans Javascript avec Struts
    Par nemoMiagiste dans le forum Struts 1
    Réponses: 3
    Dernier message: 26/12/2012, 16h16
  3. Progressbar dans un traitement long
    Par Duan dans le forum Débuter
    Réponses: 11
    Dernier message: 17/07/2011, 05h03
  4. Réponses: 1
    Dernier message: 10/06/2011, 11h07
  5. Réponses: 3
    Dernier message: 22/08/2007, 16h53

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