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 :

Pause dans une boucle (sans consommer de CPU !)


Sujet :

Delphi

  1. #1
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut Pause dans une boucle (sans consommer de CPU !)
    Salut!
    Voilà mon souci: j'essaie de faire, dans une boucle for, une pause, et de la reprendre dès qu'une condition est remplis.
    Je fais:
    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
    var
      AlerteSuivante: boolean;
     
    procedure Traitement;
    var
      i: Integer;
    begin
      for i:=1 to StringList.Count-1 do 
      begin
        AlerteSuivante:= true;
     
        // Traitement
     
        while AlerteSuivante do
          Application.ProcessMessages;
      end;
    end;
    Mais voilà, ce code bouffe à lui seul 50% du CPU!!
    Peut-on faire plus simple pour alléger le tout ?
    Merci...

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    L'utilisation de sleep ne te convient pas ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Hélas non, car ma boucle sert à déclancher la montée d'une petite fenêtre du style MSN, et je ne sais pas combien de temps elle met pour monter, rester un moment, et redescendre...
    Et il me semble qu'avec sleep ca ne marche pas non plus...Je vais tout de même essayer...
    Merci

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 333
    Points
    11 333
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while AlerteSuivante do begin
          Application.ProcessMessages;
          Sleep(100);
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Helas, ca ne marche toujours pas...
    Je vais tenter autre chose, et si ca ne marche pas, je poste le code...

  6. #6
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    Salut
    Je n'ai pas de réponse à ta question mais par contre il me semble que des fenêtres du style MSN qui apparaissent quelques secondes, il y en a des toutes faites dans la JVCL

    Bon dev
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    où modifi tu alartesuivante????
    pouqoi pas, ne faire rien et attend gentiment que quelque chose se passe??
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 501
    Points
    501
    Par défaut
    tu peu pas essayer de faire ça différemment? sans le for je veut dire ... genre mettre du code dans la partie ondestroy de la fenetre qui se ferme ou un truc dans le genre ça sera peut être plus adapté et ça reviendrais au même enfin je sais pas exactement ce que tu veu faire mais l'utilisation d'une boucle For la dedans ça me semble bizzarre ^^

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par niarkyzator
    mais l'utilisation d'une boucle For la dedans ça me semble bizzarre ^^
    c'est pas for c'est while (il est fort lui )
    selectioner tt pour lire
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 501
    Points
    501
    Par défaut
    maieuhh je parlai du code donné par petit prince pas de la solution de tourlourou (qui d'apres petitprince ne marche pas) toujours est-il que ça me parait pas forcément être une bonne idée d'utiliser une boucle (quelle qu'elle soit) juste pour attendre, ya suffisement d'evenement possible en delphi pour pouvoir faire sans apres jvais pa rentrer dans les tréfond de ma pensée tortueuse d'autant plus que je suis très probablement dans l'erreur

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par petitprince
    Salut!
    Voilà mon souci: j'essaie de faire, dans une boucle for, une pause, et de la reprendre dès qu'une condition est remplis.
    Je fais:
    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
    var
      AlerteSuivante: boolean;
     
    procedure Traitement;
    var
      i: Integer;
    begin
      for i:=1 to StringList.Count-1 do 
      begin
        AlerteSuivante:= true;
     
        // Traitement
     
        while AlerteSuivante do
          Application.ProcessMessages;
      end;
    end;
    Mais voilà, ce code bouffe à lui seul 50% du CPU!!
    Peut-on faire plus simple pour alléger le tout ?
    Merci...
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 501
    Points
    501
    Par défaut
    Citation Envoyé par petitprince
    Salut!
    Voilà mon souci: j'essaie de faire, dans une boucle for, une pause, et de la reprendre dès qu'une condition est remplis.
    Je fais:
    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
    var
      AlerteSuivante: boolean;
     
    procedure Traitement;
    var
      i: Integer;
    begin
      for i:=1 to StringList.Count-1 do 
      begin
        AlerteSuivante:= true;
     
        // Traitement
     
        while AlerteSuivante do
          Application.ProcessMessages;
      end;
    end;
    Mais voilà, ce code bouffe à lui seul 50% du CPU!!
    Peut-on faire plus simple pour alléger le tout ?
    Merci...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 501
    Points
    501
    Par défaut
    j'avoue j'avais pas compris que tu parlais de ce while la mais ça n'empeche pas que je trouve qu'utiliser des boucle (LES 2) pour ce genre de problèmes ça genère plus de difficulté que ça n'en résoud, et je pense toujours qu'il devrais restructurer son code.

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par niarkyzator
    j'avoue j'avais pas compris que tu parlais de ce while la mais ça n'empeche pas que je trouve qu'utiliser des boucle (LES 2) pour ce genre de problèmes ça genère plus de difficulté que ça n'en résoud, et je pense toujours qu'il devrais restructurer son code.
    +++1
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  15. #15
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    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 : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Bonjour,

    50 % ??, il me semble qu'il s'agit d'un faux procès et que si tu lances 3 fois ton programme chacun pourra malgré tout utiliser 30 % du cpu alors que le prédicat indiquait un blocage pour les 150 % nécessaire.

    Ceci dit tu peux utiliser un timer et repenser ton programme en conséquence.

    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
     
    procedure TForm1.Traitement(NumeroTraitement : Integer);
    begin
      if NumeroTraitement < StringList.Count then
      begin
        TraiteAlerte(NumeroTraitement);
      end;
    end;
     
    procedure TForm1.TraiteAlerte(NumeroTraitement : Integer)
    begin
      // lancer le Traitement
       showmessage(StringList.Items[NumeroTraitement]);
     
      // Mettre en place une méthode de controle de fin de traitement
      Timer.Tag := NumeroTraitement;        // Conserver le numéro de traitement
      Timer.Interval := 1000;               // permet un controle toutes les secondes de la fin de traitement
      Timer.Enabled := true;                // Ouvrir le timer de controle de fin de traitement
    end;
     
    procedure TForm1.TimerOnExecute;
    begin
      // controle la fin du traitement en cours
      //showmessage(StringList.Items[Timer.Tag]);
      if ?????? then
      begin
        // Stoppe le controle
        Timer.Enabled := false;
        // Relance le traitement là ou il en était + 1;
        Traitement(Timer.Tag + 1);
      end;
    end;
    c'est à voir.
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 501
    Points
    501
    Par défaut
    lol jpensais pas que tu serais d'accord avec moi edam ^^ ça fait plaisir

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Les timers et les pauses... hummm... moi j'essai de les déviter le plus possible.
    Pourquoi ne pas utilisé l'évènement OnChange() de la string liste...
    une petite mémorisation du dernier éléments traité et voilà...
    Pas de pause...Pas de timer... et on travaille seulement lorsque c'est requis.

    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
    47
    48
     
    var
        NumeroTraitement:integer; //Variable globale pour le traitement
     
    //=========================================================================
    //=== Traitement des nouveaux elements dans la liste.
    //===
    procedure Traitement();
    var
      i: Integer;
    begin
      for i:=NumeroTraitement to StringList.Count-1 do
      begin
            //Traitement
            showmessage(StringList.Strings[i]);
      end;
      //Memorise le numero du dernier traité
      NumeroTraitement:=StringList.Count;
    end;
     
    //=========================================================================
    //=== Evenement du string liste OnChange()
    //===
    procedure TForm1.StringListOnChange(Sender:TObject);
    begin
        Traitement();
    end;
     
    //=========================================================================
    //=== Create de la form...
    //===
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        //On creer la StringListe
        StringList:=TStringList.Create();
        //On associe notre procedure OnChange
        StringList.OnChange:=StringListOnChange;
        //Positionne le dernier élément à zéro
        NumeroTraitement:=0;
    end;
    //=========================================================================
    //=== Destruction de la form...
    //===
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
        StringList.Clear;
        StringList.Free;
    end;
    n'importe où dans le code... un simple StringList.Add() déclanchera un traitement.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  18. #18
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Tout d'abort, merci pour toutes ces réponses....
    Je vais tenter d'éclaircire le tout: une fenêtre du style MSN dans la JVCL ? c'est nouveau ? je ne connais pas... c'est sûrement nouveau car j'ai une vieille version...

    Une boucle for, c'est obligé car sinon comment faire ma boucle, car tout les champs de ma stringlist ne déclanche pas forcément d'alerte...

    Plus de 50% du cpu? en réalité dès que la première fenêtre MSN monte, la boucle s'incrémente de 1, jusqu'à ce qu'elle trouve une nouvelle alerte, et à ce moment là, et SANS FAIRE DE PAUSE, la seconde fenêtre veu donc monter, mais elle doit attendre que la première est fini, donc à ce moment là, le cpu grimpe à 50%, voire plus si une 3ème ou 4ème alerte est lancée...Lorsque je mais ma petite boucle while, pour attendre en fait que la fenêtre d'alerte redescende, là, je suis direct à 50%... J'ai tout essayé, sleep, goto, repeat until (vous me direz c'est kifkif avec while à une chouille près!!)

    Et pour finir, timer et pause je n'aime pas trop non plus (voir mon autre discussion sur "procedure à retardement"). Je vais donc tester de suite les deux dernière méthode proposée et vous rendrais compte.

    Merci à tous...

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 501
    Points
    501
    Par défaut
    dans ce cas si j'ai bien compris ce que tu pourrai faire c'est une boucle while qui parcour ton stringlist (tu met l'incrémentation dedans) jusqu'a ce 'elle trouve une alerte, la le while se fini, tu lance la fenetre qui monte, et tu t'arrange pour que la fermeture de la fenetre relance la boucle while ( onclosequerry par exemple, ou on destroy enfin je sais pas comment tes fenetre sont faites ..) La boucle for c'est fait pour se simplifier la vie (dans la meusure ou c'est un moyen plus rapide d'ecrire un truc qui normalemen prendrait plein de ligne) c'est a utiliser dans des cas bien précis et tu peut sans trop de probleme faire nimporte quel programme sans boucle for, c'est pratique mais pas indispensable, et c'est pas fait pour etre mis en pause(essaye de mettre une boucle while qui se fini jamais quelque part tu verra comment c'est drôle ^^... le compilateur dit rien, le mode pas a pas non plus faut faire attention quoi). Sinon ce que tu peu faire c'est mettre un break (ou exit enfin je sais pu exactement mais ya des truc pour terminer la boucle avant la fin).

Discussions similaires

  1. effectuer une pause dans une boucle
    Par guiguizekid dans le forum Tkinter
    Réponses: 4
    Dernier message: 30/12/2008, 20h39
  2. Pause dans une boucle
    Par Invité dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 13/10/2007, 18h28
  3. Réponses: 11
    Dernier message: 18/02/2007, 23h20
  4. Pause dans une application sans utiliser Sleep()
    Par CriPpLe dans le forum MFC
    Réponses: 9
    Dernier message: 25/03/2006, 11h00
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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