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 :

Indicateur d'avancement et timer qui bouge pas


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Indicateur d'avancement et timer qui bouge pas
    Bonjour

    je veux faire un indicateur d'avancement pour une tache qui prend du temps et dont je n'ai pas à accès à l'intérieur (pas de StepIt donc). L'indicateur enchaine différentes images sur les événements d'un timer. Donc j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonTimer.Enabled := True;
    TrucQuiPrendDuTemps();
    MonTimer.Enabled := False;
    Pour simuler, j'ai testé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonTimer.Enabled := True;
    Sleep(10000);
    MonTimer.Enabled := False;
    Je précise que le timer est bien configuré et qu'il fait bien ce que je veux quand il est lancé sans action bloquante après.

    Dans les 2 cas, le OnTimer n'est jamais appelé. Je pensais naivement qu'un timer avait un fonctionnement indépendant du programme principal. Ca n'a pas l'air le cas.

    Est-ce que je rate quelque chose ? Quelle est la solution recommandée pour faire ça ?

    Merci.

  2. #2
    Membre chevronné Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Par défaut
    Je pensais naivement qu'un timer avait un fonctionnement indépendant du programme principal
    C'est un peu ambigû ce que tu viens de dire là.
    je pense qu'un timer utilise une triade propre, je pense c'est ce que tu voulais dire. mais dans ton exemple ton Sleep Bloque tout le processus de ton application c'est un test à éviter.

  3. #3
    Invité
    Invité(e)
    Par défaut
    ok pour sleep. Je comprends qu'il bloque tout. Mais quelle est la solution pour déclencher le OnTimer pendant "TrucQuiPrendDuTemps();" ? Apparemment, on touve des solutions d'indicateur de progression à base de thread, et sans timer. C'est la bonne solution ?

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    C'est la bonne solution ?
    Ça peut.
    Mais si ton truc qui prend du temps s'appuie sur une boucle et est assez simple, tu peux lui rajouter au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ProcessMessages;
    HTH,
    --
    jp

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    Si j'ai bien compris tu essaies d'afficher un indicateur de progression.
    ben tout ce qu'il ya à faire c'est paramétrer la tempo de ton timer à 1000 par exemple.

    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
    // Puis ce qui suit :
    timer.enabled := true;
    try
      TrucQuiprendDutemps;
    finally
      timer.enabled := false;
    end;
     
    (* Dans l'evt Ontimer du Timer tu commences par désactiver le timer si l'action de ton timer peux également prendre un certain temps, autrement ca risque de se mordre la queue *)
     
    procedure ontimer();
    begin
      timer.enabled := false;
      try
        EvolutiondelindicateurdeProgression;
      // si l'action qui prends du temps bloc les rafraichissements ecrans
        Application.ProcessMessages; 
      finally
        timer.enabled := true;
      end;
    end;

  6. #6
    Invité
    Invité(e)
    Par défaut
    Voici la partie implémentation d'une appli qui maquette ce que je veux faire : une forme, un bouton, un timer.

    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
     
    function Fibonacci (n : integer) : integer;
    begin
       if n < 2
          then Result := 1
          else Result := Fibonacci (n - 1) + Fibonacci (n - 2)
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       Timer1.Enabled := True;
       Fibonacci (47);                   // ligne a
       Timer1.Enabled := False       // ligne b
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
       Color := Random (32000)
    end;
    Si je commente les lignes a et b, tout va bien, mon timer est ok. Mais tel quel, le 1er appel au OnTimer se fait après le calcul. De plus :

    - dans ce cas précis, ProcessMessages ne change rien
    - dans le cas qui m'intéresse je ne peux rien faire dans le calcul qui se passe dans une lib externe.

    En fait, ça doit être le fonctionnement normal et la solution doit surement passer par un thread. Si vous aviez un composant sous la main ...

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    Oups désolé ton Application.Processmessages il faut que tu le fasses dans ta fonction de Fibonacci et non dans le timer autrement ca sert pas à grand chose...

Discussions similaires

  1. Div qui bouge pas
    Par lionel84 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 06/01/2009, 10h01
  2. [Dates] mktime bizarre qui ne bouge pas
    Par isa150183 dans le forum Langage
    Réponses: 1
    Dernier message: 19/09/2007, 02h06
  3. Choice qui ne bouge pas!
    Par Lady dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 07/03/2007, 13h09
  4. Réponses: 6
    Dernier message: 05/05/2005, 23h47
  5. [Timer+Bitmap]Bitmap qui bouge?
    Par thief dans le forum MFC
    Réponses: 6
    Dernier message: 01/09/2004, 17h45

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