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

Contribuez Delphi Discussion :

Message "Veuillez patienter" pour une tâche un peu longue


Sujet :

Contribuez Delphi

  1. #1
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut Message "Veuillez patienter" pour une tâche un peu longue
    Voici une démonstration de l'utilisation d'une fenêtre "Veuillez patienter" à déclenchement automatique.

    le principe est d'appeler WaitForm.Submit() en lui passant en paramètre une méthode à soumettre. Celle-ci s'execute dans un Thread secondaire, si elle prend plus de 2 secondes, une fenêtre "Veuillez patienter" s'affiche avec un bouton Annuler qui permet de stopper la procédure. Sinon la fenêtre s'efface automatiquement en fin de tâche.

    Pour les besoins de l'exemple, on parcours les fichiers de C:\, avec un sleep pour ralentir le code si vous cochez la case "Ralentir" afin que la fenêtre "Veuillez patienter" s'affiche.

    Une console est également affichée pour permettre de suivre le déroulement de la tâche soumise.

    J'utilise cette technique dans une application qui effectue des requêtes SQL qui sont parfois longues, parfois très rapides, WaitForm s'occupe de tout !

    Submit.zip
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Roh, mais ça m'a l'air excellent ça... et ça tombe à point

    Merci M'sieur !

  3. #3
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 593
    Points
    593
    Par défaut
    C'est un immense plaisir de me retrouver avec vous dans un même forum Mr PAUL
    <On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**

  4. #4
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Bonjour,

    Existe-t-il un équivalent en D7 ?

    En tous cas merci pour la contrib
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  5. #5
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Oups ! ca fonctionne en D7. Fallait essayer avant de poster.
    Je pensais que c'était pour les version récente de Delphi
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    c'est fait sous Delphi 6 mais ça doit fonctionner avec à peu près toutes les versions
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Encore merci Paul
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  8. #8
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Voici une autre version avec fonctions BeginThread,EndThread ...
    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
    interface
     
    uses
      Windows, Messages, Controls, Forms,Dialogs;
     
    type
       TProcess= procedure of object;
     
    function Submit(Process: TProcess): integer;
     
    implementation
    type
       PProcess=^TProcess;
    function StartMe(Hwnd: HWND): integer;
    begin
      Result := 0;
      with FindControl(Hwnd) do
      try
         PProcess(Tag)^;
      except
        Result := -1;
      end;
      PostMessage(Hwnd,WM_CLOSE,0,0);
      EndThread(Result);
    end;
     
    function Submit(Process: TProcess): integer;
    var
     FThread :Cardinal;
    begin
      with CreateMessageDialog('Veuillez patienter...', mtCustom, [mbAbort])do
      try
           Tag:=Integer(@@Process);
           FThread := BeginThread(nil,0,@StartMe,Pointer(Handle),0,PDWord(nil)^);
           if WaitForSingleObject(FThread,2000) = WAIT_TIMEOUT then
             if ShowModal()= mrAbort then
                TerminateThread(FThread, DWORD(-1));
           WaitForSingleObject(FThread,INFINITE);
           GetExitCodeThread(FThread, PDWord(@Result)^) ;
           CloseHandle(FThread);
      finally
         Free;
      end;
    end;
     
    end.

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    intéressant, mais la même chose sans transtypage ésotérique serait plus portable

    n'oublie pas que Embarcadero nous prépare un Delphi 64 bits
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Super ! j'aurais besoin de ça
    Merci Montor
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  11. #11
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 36
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Voici une démonstration de l'utilisation d'une fenêtre "Veuillez patienter" à déclenchement automatique.

    le principe est d'appeler WaitForm.Submit() en lui passant en paramètre une méthode à soumettre. Celle-ci s'execute dans un Thread secondaire, si elle prend plus de 2 secondes, une fenêtre "Veuillez patienter" s'affiche avec un bouton Annuler qui permet de stopper la procédure. Sinon la fenêtre s'efface automatiquement en fin de tâche.

    Pour les besoins de l'exemple, on parcours les fichiers de C:\, avec un sleep pour ralentir le code si vous cochez la case "Ralentir" afin que la fenêtre "Veuillez patienter" s'affiche.

    Une console est également affichée pour permettre de suivre le déroulement de la tâche soumise.

    J'utilise cette technique dans une application qui effectue des requêtes SQL qui sont parfois longues, parfois très rapides, WaitForm s'occupe de tout !

    Submit.zip
    bonjour j'ai le même problème mon application établi un traitement très long et je qu'une progressebare s’affiche cependant ce traitement votre idée aussi me plait ms je sais pas comment créer un waitform dans le vb.net
    merci de me répondre

  12. #12
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par safailizabet Voir le message
    bonjour j'ai le même problème mon application établi un traitement très long et je qu'une progressebare s’affiche cependant ce traitement votre idée aussi me plait ms je sais pas comment créer un waitform dans le vb.net
    merci de me répondre
    sans doute faut-il poser la question sur le forum VB !

    ou vous mettre à Delphi...je suis revendeur
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Ajouter un progress bar au waitform
    Merci Paul pour le tuto très instructif.
    Je voudrais rajouté un progress bar sur la fiche waitform.
    Des indications svp.
    Merci

  14. #14
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Bonsoir,

    pour les progressbar j'utilise toujours la même technique:

    - le thread utilise un PostMessage(Form.Handle, WM_USER, Position, Maxi);

    - la fiche capte l'événement pour mettre à jour la progressbar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.WMUser(var Msg: TMessage); // message WM_USER
    begin
      ProgressBar.Max := Msg.lParam;
      ProgressBar.Position := Msg.wParam;
    end;
    le fait d'utiliser un PostMessage() évite de bloquer le Thread, par contre cela peut générer un grand nombre de messages pour rien (selon le traitement...) dans ce cas il suffit d'adapter comme ceci, où "MODULO" indique le nombre de positions à sauter avant de mettre à jour la progressbar.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      if (Position mod MODULO) = 0 then
        PostMessage(Form.HAndle, WM_USER, Position, Maxi);
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Des idées d'algorithme pour une tâche de planification
    Par laureat dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 22/08/2009, 15h39
  2. Réponses: 6
    Dernier message: 20/12/2008, 15h59
  3. Message personnalisé "Veuillez patienter"
    Par jmde dans le forum Access
    Réponses: 2
    Dernier message: 27/09/2006, 13h07

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