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

 Delphi Discussion :

Attente indésirable D10 Seatlle


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut Attente indésirable D10 Seatlle
    Bonjour,

    Mon application est déclinée en 2 versions dont l'une voit une fenêtre d'attente de 30 secondes avant que l'appli ne soit disponible.
    Voici le code utilisé:
    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
     
    procedure TfrmOpen.Waiting;
    var
       i: Integer;
    begin
      intDelay:= 30;
      CloseOK := False;
      // countdown
      for i := 0 to (intdelay) do
      begin
        Application.ProcessMessages;
        Sleep(1000);
        lblDelay.Caption:= 'You have to wait: ' + FloatToStr(intDelay - i)
                         + ' seconds before closing this dialog';
        imgDonate.OnClick:= imgDonateClick;
      end;
      lblDelay.Caption:= 'click anywhere on the message to close!';
      CloseOK:= true;
    end;
     
    procedure TfrmOpen.Image1Click(Sender: TObject);
    begin
      if CloseOK  then
        Self.Close;
    Ensuite, lorsque la fenêtre d'attente se ferme, l'appli cherche si un programme externe est ouvert.
    Si celui-ci n'est pas lancé l'appli ouvre un dialogue pour demander si l'utilisateur souhaite l'ouvrir.
    Dans l'affirmative le programme est lancé depuis l'appli.

    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
     
     if (fmControlPanel.rdgWxSource.ItemIndex = 1)
      and((GstrSimPath <> '') or (fmControlPanel.edAsP3DPath.Text <>''))
      and(GintSimu = 2) then
      begin
        if not ProcessExists('AS16.exe') then
        begin
          if MessageDlg('Active Sky 2016 for P3D is selected as the weather source. '
                                   + #13#10 + 'However, it is not running. ' +
                                   'Do you want CPS-X to launch it for you?', mtWarning,
                                   [mbYes,mbNo],0)= mrYes then
          begin
            if GstrAsPath <> '' then
              ShellExecute(Handle,'open',PChar(GstrAsPath +
                          '\AS16.exe'), Nil, Nil, SW_SHOW)
            else
              ShellExecute(Handle,'open',PChar(fmControlPanel.edAsP3DPath.Text +
                          '\AS16.exe'), Nil, Nil, SW_SHOW);
            GbooAsLaunch:= True;
            GbooNoaaLaunch:= False;
          end
          else
          begin
            fmControlPanel.rdgWxSource.ItemIndex := 0;
            frmMain.lblWxSource.Caption:= 'WX source selected : ' + fmControlPanel.
                                  rdgWxSource.Items
                                  [fmControlPanel.rdgWxSource.ItemIndex];
            IniFile:= TIniFile.Create(ChangeFileExt(Application.ExeName,'.cfg'));
            IniFile.WriteInteger('WX', 'WxSource',
                                 fmControlPanel.rdgWxSource.ItemIndex);
            IniFile.Free;
            GbooNoaaLaunch:= True;
            GbooAsLaunch:= False;
          end;
        end;
      end;
    Voici le souci:
    Si c'est la version sans fenêtre d'attente qui fonctionne, le programme externe est lancé aussitôt le dialogue fermé par Yes.
    Si la version avec fenêtre d'attente qui tourne, le dialogue s'affiche normalement, mais le programme externe ne se lance qu'après un long délai d'environ 30 secondes si Yes est cliqué.

    Je précise que le code des deux version est le même avec comme seule différence une compilation conditionnelle pour avoir ou non la fenêtre d'attente.

    Pourriez vous m'aider à trouver la cause de cette différence?

    Merci

    Cordialement
    Pierre

  2. #2
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Tu n'es pas dans un thread, la procédure Waiting va "bloquer" ton code pendant 30 secondes. Utilise aussi plutôt un lblDelay.Update à la place du Application.ProcessMessages (si tu souhaites uniquement mettre à jour le texte du label).

    Tu as sans doute pas besoin d'affecter la valeur de l'événement OnClick 30 fois

    Si tu as envie d'attendre un résultat utilise plutôt une TTask pour gérer ton message d'attente.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Merci de cette réponse,

    Le blocage du code pendant 30 secondes n'est pas un problème.
    lblDelay.Update empêche la fenêtre principale su laquelle s'affiche celle d'attente de finir de se dessiner, Application.ProcessMessage non.

    Merci de m'avoir signalé le OnClick 30 fois.

    Je n'ai jamais utilisé les TTasks. Je vais explorer cette voie.

    Cordialement
    Pierre

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    J'ai résolu le problème en appelant la routine de recherche et de lancement du programme externe avant l'ouverture de la fenêtre d'attente.
    Tout fonctionne selon mes souhaits.

    Merci de vos réponses

    Cordialement
    Pierre

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

Discussions similaires

  1. procédure attente
    Par Mau dans le forum Réseau
    Réponses: 7
    Dernier message: 26/09/2003, 22h23
  2. Délai d'attente expiré
    Par amiral thrawn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/04/2003, 12h04
  3. recupèrer file d'attente d'impression
    Par magic corp. dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2002, 14h12
  4. [Choix] Quelles attentes par rapport aux SGBD ?
    Par thierry34 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 13/07/2002, 20h08

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