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

Turbo Pascal Discussion :

[TP]Timer


Sujet :

Turbo Pascal

  1. #1
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut [TP]Timer
    Salut à tous!

    Comment pourrais obtenir le même résultat que MemL[Seg0040:$6C]:
    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
    Uses Winprocs,Wincrt;
    Var s1,s2:Longint;
     
    {$IFDEF WINDOWS}
    Procedure __0040H;  far; external 'Kernel' index 193;
    const  Seg0040: Word = Ofs(__0040H);
    {$ENDIF}
     
    Begin
     Clrscr;
     s1:=MemL[Seg0040:$6C];
     s2:=GetCurrentTime;
     Repeat
      Gotoxy(1,1);
      Writeln(MemL[Seg0040:$6C]-s1);
      Writeln(GetCurrentTime-s2);
     Until(KeyPressed);
    End.
    J'ai essayé avec GetCurrentTime, mais ce n'est pas linéaire...

    Merci de votre aide! à+
    De retour parmis vous après 10 ans!!

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    En faisant le rapport suivant, j'obtiens environ 55:
    Writeln(GetCurrentTime Div MemL[Seg0040:$6C]);

    Et j'ai trouvé cette unité sur le net:
    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
    Unit TIMER;
     
    Interface
     
    Type
      TimerBuf = LongInt;
     
    Procedure StartTimer(Var t: TimerBuf);
    Function TrapTimer(t: TimerBuf; MilliSeconds: Word): Boolean;
     
    Implementation
     
    Procedure StartTimer(Var t: TimerBuf);
    Begin
      t := MemL[Seg0040:$6C]
    End;
     
    Function TrapTimer(t: TimerBuf; MilliSeconds: Word): Boolean;
    Begin
      TrapTimer := Trunc(t+MilliSeconds/54.92549322) > MemL[Seg0040:$6C]
    End;
     
    End.
    54.92549322 a l'air d'être une constante.
    Est-elle la même sur tous les pc?
    A quoi peut-elle correspondre exactement?
    De retour parmis vous après 10 ans!!

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Le DWord situé at l'adresse 0040:006C correspond au nombre de ticks après minuit... Chaque tick est émis 18.2 par seconde (18,2 est environ égale à 4,77 (vitesse en MHz du processeur du premier PC, le Sperry PC) divisé par 4 (soit 1,19 environ) divisé par 65536 (le plus grand nombre stockable "à l'époque" ?)).
    Est-ce que tes calculs correspondent avec ces informations ? Que veux-tu faire exactement ?

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ben 1000 millisecondes divisés par 18.2 est environ égale à 54,945...

    Ca réponds à ta question ?
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Oui, j'ai déjà vu cette constante 18,2 dans des sources...
    En fait, je désire un équivalent, car j'ai l'impression que MemL[Seg0040:$6C] ne marche pas sous Linux.
    Je crois bien que GetCurrentTime / 54.92549322 me renvoit quelque chose d'assez correct...
    Qu'en pensez-vous?
    De retour parmis vous après 10 ans!!

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Cette valeur est gérée par le BIOS donc elle est accessible sur toutes les machines compatibles IBM (c'est-à-dire depuis 1981 environ), et évidemment sur toutes les plateformes !

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  7. #7
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Arf! Dans ce cas, le bug doit venir de cette déclaration je suppose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {$IFDEF WINDOWS}
    procedure __0040H;  far; external 'Kernel' index 193;
    const Seg0040: Word = Ofs(__0040H);
    {$ENDIF}
    En tous les cas, mon prog à son horloge bloquée lorsque je le lance avec l'émulateur win sous Linux...
    En fait, j'espère que cette solution résolvera le problème... à+
    De retour parmis vous après 10 ans!!

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ben tu n'as justement pas besoin de ça, vu que ca marche sur toute plateforme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const seg0040=$0040;
    Euh à ce propos, TP défint des variables comme Seg0040 ou SegA000 qui désigne les segments correspondants !

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  9. #9
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Exact! Ta solution fonctionne... Pas encore testé sous Linux, mais je suis confiant.
    Je me demande pourquoi l'auteur de l'unité à utilisé ce code, alors que MemL[$0040:$6c] suffisait...

    Merci pour ta participation, et pour avoir résolu ce problème!
    à+
    De retour parmis vous après 10 ans!!

  10. #10
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    De rien, ce fut avec plaisir comme toujours
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  11. #11
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Après avoir testé sous Linux les 3 possibilités...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {$IFDEF WINDOWS}
    procedure __0040H;  far; external 'Kernel' index 193;
    const  Seg0040: Word = Ofs(__0040H);
    {$ENDIF}
    est bien bloqué...

    Démarre très doucement, puis se lance normalement au bout de 3 ou 4 sec...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    round(GetCurrentTime/54.92549322);
    fonctionne à merveille!
    à+
    De retour parmis vous après 10 ans!!

  12. #12
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Pour info, si TP définit les variables Seg0040, par exemple, c'est parce qu'en mode protégé, l'adresse $0040 n'est pas accessible et il faut créer un sélecteur dessus pour y accéder.

    Sous Windows, il faudrait aussi créer un sélecteur dessus. Si Win 3.1 eccepte la manip, je doûte qu'il en soit de même avec Win 95 et suivants, car un programme qui peut créer un sélecteur librement s'ouvre toutes les portes sur la RAM, donc met en danger la stabilité du système.

    Pour la valeur exacte de 54,... :

    T = 1000 / ($1234DD / $10000)

    $1234DD est simple à se souvenir en hexa, plus que 1193181 Hz, fréquence du chip 8254 (qui gère l'hologe interne).

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  13. #13
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Excelente cette méthode!
    Solution finale...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Round(GetCurrentTime/(1000/($1234DD/$10000)));
    Vos explications sont claires et bien détaillées.
    Merci à tous pour votre aide!
    Merci aussi à FRD pour avoir fait les tests sous Linux!
    à+
    De retour parmis vous après 10 ans!!

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

Discussions similaires

  1. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

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