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

Langage Delphi Discussion :

Probleme de temporisation


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 155
    Points : 47
    Points
    47
    Par défaut Probleme de temporisation
    Bonjour,
    Je travaille sur du texte defilant et j'aimerai afficher successivement ma liste a l ecran. Le tout fonctionne avec un timer qui fait defiler l info une fois de gauche a droite.
    Evidemment quand j appelle ma liste le programme ne laisse pas le temps d afficher l info car il boucle deja sur les affichages successifs et ainsi de suite.
    J aimerai laisser le temps a chaque info d afficher son info mais quand je fais un sleep le tout est bloque vu que sleep est bloquant.
    Quelqu un aurait une idee ?
    merci d avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 155
    Points : 47
    Points
    47
    Par défaut
    personne n a d idee ?

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Mise à jour du texte (1er texte, ou changement) :
    - Mettre la valeur du Interval à une valeur permettant la lecture, par exemple 10 s (10.000 ms).
    - Laisser le timer actif.

    Dans le OnTimer :
    - Effectuer le scrolling,
    - Régler le Interval à une valeur acceptable (ex : 200 ms).

    Lorsque le texte va défiler, tu vas à chaque fois "écraser" le Interval, mais avec une valeur identique => aucun problème.

    Encapsule tout ça via des accesseurs (propriétés), ou des gestionnaires OnChange, de manière à te simplifier la vie à la mise à jour, et feu... ;-)

    Ca te va ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Pour faire plus simple je propose 2 Timer.
    Un de defilement regle a 100ms par exemple et un d'attente regle a 5000ms par exemple.

    Tu active celui de defilement (l'autre etant inactif).
    ensuite quand ton defilement est fini, tu desctive ce timer et actine celui d'atent qui ne s'executera qu'une fois. Lors de son activation tu change l'info a faire defiler et reactive le premier timer.

    Si tu souhaite faire defiler les infos Xms et ensuite changer d'info, le principe est le meme (2 timer) mais tout 2 actif. Le premier s'occupe de faire defiler le texte, le 2e s'occupe de changer le texte quand il s'active ....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    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 771
    Points
    2 771
    Par défaut
    deux timer c'est de gaspiyage sa
    moi jutilise un seul pour un ta de chose plus de 5 traitement avec un timer a 10ms (temp, contol de touche de controll, mise a jour,....)
    voila un exmple de la mien
    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
    49
     
    procedure TFPrincip.Timer1Timer(Sender: TObject);
    var
        z,w:integer;
        rec:TRect;
    begin
         STTime.Caption:=FormatDateTime('hh:nn:ss',Time);
         if date-naz>1 then
           STDate.Caption:=AnsiUpperCase(FormatDateTime('dddd dd mmm yyyy',date));
         z:=(GetKeyState(20) and 1) or ((GetKeyState(45) and 1) shl 1) or
                 ((GetKeyState(144) and 1) shl 2);
         w:=(z xor Shifa);
         if w>0 then
           begin
             if w and 1 >0 then
               BEGIN
                 panel5.Font.Color:=Coule[(z and 1)>0];
                 windows.Beep(1500,50);
               end;
             if w and 2 >0 then
               begin
                 panel4.Font.Color:=Coule[(z and 2)>0];
                 windows.Beep(3000,50);
               end;
             if w and 4 >0 then
               begin
                 panel3.Font.Color:=Coule[(z and 4)>0];
                 windows.Beep(4500,50);
               end;
             Shifa:=z;
           end;
         inc(Progre);
         rec:= barp.Canvas.ClipRect ;
         if Progre*10>barp.Width then
           begin
            Progre:=0;
            BarP.Canvas.Brush.Color:=$FFFF;
            BarP.Canvas.Pen.Color:=$FFFF;
            BarP.Canvas.Rectangle(rec);
           end;
         barp.Canvas.Brush.Color:=$FF;
         for z:=0 to progre do
           begin
             rec.Left:=z*10;
             rec.Right:=z*10+10;
             BarP.Canvas.Rectangle(rec);
           end;
         PaintBox1.Repaint;
    end;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 155
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos reponses mais je vous avoue que je n arrive a en mettre aucune en place...
    Il n existe pas de fonction wait en delphi, qui ne stoppe pas l execution courante mais attend tt simplement ?
    merci d avance

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 155
    Points : 47
    Points
    47
    Par défaut
    Je voudrais en fait tt simplement que le programme attente tant que mon timer est actif car il se desactive. mais en faisant un while on arrive a saturation directe vu le nombre d operations.
    La je suis vraiment perdu ...

  8. #8
    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 771
    Points
    2 771
    Par défaut
    tu peut en moin donner votre code pour voir le hic
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  9. #9
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par gilles641
    Je voudrais en fait tt simplement que le programme attente tant que mon timer est actif car il se desactive. mais en faisant un while on arrive a saturation directe vu le nombre d operations.
    La je suis vraiment perdu ...
    Dans ce cas c'est simple : Tu declare une variable booleene globale : "Sotpped" qui est a false par defaut.
    Une fois le time enclanché tu la met a true, jusqu'a ce que tu decide de couper le timer.

    Ensuite, il te suffit d'inserer dans chaques procedure evenement (Onshow, Onclick, etc ...) un teste en premiere ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If stopped Then Exit;
    Du coup tant que le timer ne sera pas activé, ton programme ne repondra plus aux evnements claviers /souri/Windows, seuls point d'entree dans l'execution de ton code.

    [Edit]
    Pense jsute a rajouter l'evenement onclosequery sur tes fiche pour affecter a false Canclose si tu ne veux pas que le programme ou les fiches puissent etre fermees tant que letimer marche ....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 155
    Points : 47
    Points
    47
    Par défaut
    Tout d abord merci pour tes reponses.
    en fait, je ne crois pas que ce soit exactement ca mon probleme
    En fait je vais l'expliquer en details pour que ce soit plus facile a comprendre.
    Alors, j ai 2 timers dont l un qui affiche des infos du bas vers le haut et l ' autre de droite a gauche.
    Une info est diffusee a la fois, les 2 timers se passent regulierement la main pr changer le type d affichage.
    J ai cree une liste d info et j ai une methode afficheInfo(i) qui l affiche horizontal ou vertical en fct de i ( details )
    ma grosse methode afficheListeInfos() appelle successivement afficheInfo(i) pour tout i.
    Dc a chaque fois que affiche(I) est appele, le programme a pas le temps de faire qq chose car affiche(i+1) est appele direct apres.
    Si je fais des tests du genre while (timer1.enable) or (timer2.enabled)
    do
    'ne rien faire par exemple'
    et ben le while fait tout saturer.
    Ac un 3eme timer j y arrive pas je comprends pas pkoi.
    Si je pouvais trouver une fonction du genre sleep non bloquant mon probleöe serait resolu.
    Voila le probleme.
    Merci encore pour ta reponse

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Justement .. c'est de la que viens ton probleme.
    Il ne fait pas faire de boucles "While" ou "For" ...
    Appele juste AficheInfo(0) (ou 1 .. depends de tes bornes).

    Ensuite uen fois l'affichage fini, tu appele Dans le timer (au moment ou tu est sense arreter ce timer pour enclancher l'autre je suppose) Afficheinfo(i)

    Pour gerer les index .. je te conseilel de passer par le Tag.

    dans ta premier eprocedure Tu lance affiche info de Timer.Tag (initialise a 0 ou un en fonction de ...)

    Ensuite lors du changement, tu fait un Timer.Tag := Timer.Tag + 1 et affiche info de Timer.Tag ....

    En resumé c'ets les timers qui appellent successivement les affichesInfos lors de leurs arret et non une boucle for qui s'executera sans attendre la fin du timer.
    Ca serait trop long a expliquer mais rtenseigne toit sur la maniere dont sont gerer les evenements et tu comprendre un peu plus le pourquoi du comment
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 155
    Points : 47
    Points
    47
    Par défaut
    merci Clorish.
    Je vais tenter tes conseils :-)
    Je te tiens au courant que cela marche ou non sur le post.
    a plus tard

  13. #13
    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 771
    Points
    2 771
    Par défaut
    pourqoi pas utilisé un seul timer ala fin du décallage tu change la direction au lieu de passé la min a l'autre timer
    comme sa tu es sur de traivail avec un seul et pour ne pas entrée en confli
    dans ta boucle (comme clorich je te déconseil) ajout un application.processemessage
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  14. #14
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Application.processmessage ?!?
    Rien a voir ... Un appel a cette fonction entraine l'execution des evenement ce qu'il veux justement eviter ....
    et en plus ca enleve l'aspect bloquand de la boucle donc lance dans la meme miliseconde tous les affichages (et vi .. une instruction s'execute tres rapidement )

    Le but etait de bloquet les iteration de la boucle sans figer le programme ... et pour ca le seul moyen (propre) est de supprimer la boucle et de bloquer les evenements avec un test boolean.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  15. #15
    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 771
    Points
    2 771
    Par défaut
    1-démarrage dans votre oncreat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    timer1.inteval:=3000;
    direction:=-1;//peut importe
    activ:=false;
    2-dans ontimer aprés les 3000ms
    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
     
    if not activ then
    begin
    activ:=true;
    timer1.inteval:=100;
    direction:=1;//direction vers haut 
    p:=100;nbr:=0;
    end;
    if activ then
    begin
     inc(p);
     if p=0 then 
       begin
         p:=0;
         inc(nbr);
         if nb>nbdrligne then
           begin
             nb:=0;
             d:=-d; 
           end
        end;  
        decalinformation(d); // avec d 1:vers gauch, -1 vers droit
     end;
     
    end;
    a peut prés car je sais pas exactement comment tu fait le decalage dans timer ou en applent une procedure
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 155
    Points : 47
    Points
    47
    Par défaut
    merci tt le monde pr vos reponses.
    Finalement je n ai utilise qu un seul timer qui fonctionne tres bien ms cela m a pris bcp de temps car en fait g une liste d infos a diffuser, chacune possede un temps de diffusion et les infos trop longues doivent etre obligatoirement etre diffusee suivant la direction horizontale.
    Lors de la suppression d elements ds la liste apres leur time to live j avais des depassements d indics.
    maintenant c bon ( 2 jours )
    merci encore

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

Discussions similaires

  1. Probleme de temporisation
    Par peaceandloveman01 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/06/2007, 14h32
  2. probleme de temporisation
    Par iragorn dans le forum C++
    Réponses: 2
    Dernier message: 23/09/2005, 11h16
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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