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
    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 !

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

  2. #2
    Membre éclairé
    Roh, mais ça m'a l'air excellent ça... et ça tombe à point

    Merci M'sieur !

  3. #3
    Membre confirmé
    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 confirmé
    Bonjour,

    Existe-t-il un équivalent en D7 ?

    En tous cas merci pour la contrib
    Le Savoir c'est le Pouvoir !
    S.Freud

  5. #5
    Membre confirmé
    Oups ! ca fonctionne en D7. Fallait essayer avant de poster.
    Je pensais que c'était pour les version récente de Delphi
    Le Savoir c'est le Pouvoir !
    S.Freud

  6. #6
    Expert éminent sénior
    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 confirmé
    Encore merci Paul
    Le Savoir c'est le Pouvoir !
    S.Freud

  8. #8
    Membre éprouvé
    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
    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 confirmé
    Super ! j'aurais besoin de ça
    Merci Montor
    Le Savoir c'est le Pouvoir !
    S.Freud

  11. #11
    Nouveau Candidat au Club
    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 !

    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
    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
    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
    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