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 :

petit problème avec Application.ProcessMessages


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut petit problème avec Application.ProcessMessages
    Bonjour à tous,

    J'ai un traitement très très long (extraction de donnée d'une base de donnée) qui dure presque 1 H.
    J'avais un plantage (la fenêtre figé, et les processbar qui ne bougeais plus, mais l'application qui réalisait son travail. Très pénible pour l'utilisateur, sachant en plus qu'en mode debugage pas de problème.

    J'ai trouvé dans la FAQ un exemple qui marche mais me provoque 1 bug

    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
      Stop := False;
      I    := 0;
      { Traitement long }
      Repeat
        Inc(i);
        Label1.Caption := IntToStr(i);
        { Mise à jour des évènements en attente }
        Application.ProcessMessages;
      Until (i>=100000000)Or Stop; //modif à 10000
    end;
     
    procedure TForm1.BoutonStopClick(Sender: TObject);
    begin
      { Demande d'arrêt de la boucle }
      Stop:=True;
    end;
    J'ai mis mon traitement a l'endroit indiqué. et donc cela marche enfin presque. J'ai ma fenetre qui se duplique, celle de devant devient inactive, sur celle de derrière sur laquelle les progressbar se mette à jour, le bouton stop ne marche pas.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    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 548
    Points : 25 118
    Points
    25 118
    Par défaut
    Fenêtre qui se duplique ??? Je ne vois pas comment, sauf si tu as fait deux Create ...

    Ensuite, pour le until, remplace ta limite de compteur, par une limite temporel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      TimeOut := GetMaximumDelay(); // Paramètre, ça pourrait être bien en fonction des postes ! En MilliSecondes ! 
     
      StartTime := GetTickCount(); // Pas forcément précis, en MilliSecondes, tu en as pour 49.7 jours au plus :mouarf: 
      repeat
        Inc(i);
        Label1.Caption := IntToStr(i);
        { Mise à jour des évènements en attente }
        Application.ProcessMessages; // peut être ne pas appeler systématiquement mais disons au plus 10 fois par secondes ... sinon tu passe ton temps à l'appeler ...
       PointTime := GetTickCount(); // Idem, tu peux vérifier le temps qu'au bout que toutes les 1000 ou 10000 itérations ...
       // Continue tant que l'Objet est vide ou que le Délai Maximum soit écoulé
      until Stop or (PointTime >= StartTime+TimeOut);
    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Merci pour ta réponse, je vais essayer d'y mettre en oeuvre. Par contre l'histoire des 2 fenetres, je ne vois pas de 2eme create. Je vais faire plus de recherche

    Merci pour ta réponse rapide
    Tornade

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    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 548
    Points : 25 118
    Points
    25 118
    Par défaut
    tu n'aurais pas laisser une fenêtre dans le DPR (Application CreateForm) et ajouter en plus un TForm.Create ...
    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 régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Je n'arrive pas a expliquer l'apparition de la double fenetre, par contre j'ai completement modifié, le déroulement avec le ProcessMessages.

    En fait le traitement long, n'était qu'une boucle, j'ai donc ajouter l'instruction après chaque Next, et cela m'a complétement déverouiller les problèmes de figé et de fenetre fantome.

    Merci beaucoup pour votre aide.

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

Discussions similaires

  1. Un petit problème avec pop
    Par Paulinho dans le forum C++
    Réponses: 4
    Dernier message: 13/11/2005, 20h57
  2. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  3. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  4. problème avec Application->ProcessMessages()
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/08/2005, 10h27
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

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