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 :

Delphi ne reconnait pas GetTickCount64


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut Delphi ne reconnait pas GetTickCount64
    Bonjour,

    Je développe une application avec Delphi 2006 sous Windows Vista.

    J'aimerais utiliser la fonction GetTickCount64 (http://msdn2.microsoft.com/en-us/lib...11(VS.85).aspx). Malheureusement Delphi ne reconnait pas cette fonction alors qu'il arrive à utiliser GetTickCount (http://msdn2.microsoft.com/en-us/lib...08(VS.85).aspx).

    Le GetTickCount64 a l'avantage de ne pas obliger un redémarrage de l'ordinateur tous les 49 jours !

    Dés lors, comment puis je faire pour utiliser GetTickCount64 ?

    D'avance merci pour vos réponses.



    xenos

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    En indiquant manuellement, que cette fonction vient de la DLL kernel32.dll
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    Cette fonction n'est dispo que pour Windows 64 bits ou Windows Server 2008 je crois ?!
    Akim Merabet

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    Salut,

    Cette fonction n'est dispo que pour Windows 64 bits ou Windows Server 2008 je crois ?!
    C'est vrai que dans XP, je ne l'ai pas trouvée.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    en fait non ca marche !

    voici la declaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function GetTickCount64: Int64; StdCall; external 'Kernel32.dll' name 'GetTickCount64';
    heu j'ai vista business 32bits
    Akim Merabet

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pour plus de précision il y aussi QueryPerformanceCounter qui 64bit depuis Win95 et NT4 ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour votre aide Lung et Kaféine.

    GetTickCount64 fonctionne maintenant.

    En effet, cette fonction n'est disponible que pour peu d'OS, voici ce qui est écrit dans la documentation :

    Citation Envoyé par doc Windows
    Requirements
    Client Requires Windows Vista.
    Server Requires Windows Server 2008.
    Dernière question ... en utilisant une telle requête après 1000 jours de lancement, je risque d'avoir un overflow, non ? ... un nombre trop grand que pour pouvoir le gérer ...

    Comment pourrais je faire dés lors pour traiter ce nombre ?

  8. #8
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    avec Int64 il y a de la marge je pense
    Akim Merabet

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Sous Win95, 98 et NT, le passage à 49,7 jours était un plantage magistral !
    Sous Win2K et +, le passage à 49,7 jours est une remise à zéro
    GetTickCount renvoi un Entier Positif

    GetTickCount64 ou QueryPerformanceCounter renvoyent un Entier Signé, est qu'une fois la limite atteinte, il passe à Zéro ou en Négatif ?

    On peut penser qu'ils ont géré l'improbable ..., car maintenant, à part si ton programme dure deux centaines de millions d'année pour GetTickCount64 ou plus de 50 000 ans pour QueryPerformanceCounter (dépend de la vitesse du processeur), cela devrait tenir !

    Après tout dépend, ce que tu veux en faire, il ne serait pas plus simple, de récupérer la Date au démmarage de ton programme via Now\GetLocalTime puis de faire la différence entre la nouvelle date courante, et celle du démarrage ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    En effet, ça devrait tenir ...

    Un Int64 va jusqu'à 2^63-1. Une année est constituée de 1000 * 60 * 60 * 24 * 365,25 milli-secondes. Int64 / le nombre de milli-secondes = 146 135 511 années ...

    Heureusement j'ai bien l'intention de redémarrer le pc tous les 146 millions d'années ! Ouf, je suis sauvé !

    Citation Envoyé par ShaiLeTroll
    Après tout dépend, ce que tu veux en faire, il ne serait pas plus simple, de récupérer la Date au démmarage de ton programme via Now\GetLocalTime puis de faire la différence entre la nouvelle date courante, et celle du démarrage ...
    Si j'utilise le GetTickCount, c'est pour effectuer des pauses de X milli secondes entre deux traitements. Il me semble que c'est ce qu'il y a de mieux pour une telle pause.

    En tout cas merci à tous pour votre aide.

  11. #11
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Heureusement j'ai bien l'intention de redémarrer le pc tous les 146 millions d'années
    lol on sera tous (les humains) des pc dans 148 millions d'années
    Akim Merabet

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par xenos Voir le message
    Un Int64 va jusqu'à 2^63-1. Une année est constituée de 1000 * 60 * 60 * 24 * 365,25 milli-secondes. Int64 / le nombre de milli-secondes = 146 135 511 années ...
    Euh, on a pas la même calculatrice ?

    (2^63) / (1000 * 60 * 60 * 24 * 365,25 ) = 292 271 023

    Pour faire des "pauses", tu peux utiliser Sleep, qui manque un peu de précision, car j'ignore comment tu fais ta pause, mais si c'est une boucle genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    StartTime := GetTickCount();
    repeat
      PointTime := GetTickCount();
    until not PointTime >= StartTime+TimeOut;
    C'est une pause à 100% du Proc

    je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    StartTime := GetTickCount();
            repeat
              Sleep(1); // Il laisse une Milliseconde Entière aux Autres Processus
              Application.ProcessMessages(); // uniquement si NON Threadé
              PointTime := GetTickCount();
            // Continue tant que l'Objet est vide ou que le Délai Maximum soit écoulé
            until (PointTime >= StartTime+TimeOut);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Euh, on a pas la même calculatrice ?

    (2^63) / (1000 * 60 * 60 * 24 * 365,25 ) = 292 271 023
    En effet ...

    Mais j'ai pas fait le même calcul, j'ai fait :

    (2^(63 - 1)) / (1000 * 60 * 60 * 24 * 365,25 ) = 146 135 511 - FAUX

    Alors qu'il aurait fallu faire :

    ((2^63) - 1) / (1000 * 60 * 60 * 24 * 365,25 ) = 292 271 023 - CORRECT

  14. #14
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    StartTime := GetTickCount();
            repeat
              Sleep(1); // Il laisse une Milliseconde Entière aux Autres Processus
              Application.ProcessMessages(); // uniquement si NON Threadé
              PointTime := GetTickCount();
            // Continue tant que l'Objet est vide ou que le Délai Maximum soit écoulé
            until (PointTime >= StartTime+TimeOut);
    Je fais exactement comme ça.

    Par contre tu as dis plus haut :

    Citation Envoyé par ShaiLeTroll Voir le message
    Sous Win95, 98 et NT, le passage à 49,7 jours était un plantage magistral !
    Sous Win2K et +, le passage à 49,7 jours est une remise à zéro
    GetTickCount renvoi un Entier Positif
    Ce qui voudrait dire que si je commence ma boucle à la valeur la plus grande que le GetTickCount peut renvoyer, soit 49,7 jours après le lancement du logiciel, il va attendre que le GetTickCount lui renvoie cette valeur + X milli-secondes ...

    En gros il va boucler indéfiniment, si le GetTickCount après avoir renvoyé sa plus grande valeur retombe à 0 ...

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

Discussions similaires

  1. Delphi 7 ne reconnait pas la valeur Null
    Par crackosd dans le forum Langage
    Réponses: 4
    Dernier message: 17/01/2008, 13h33
  2. [Debutant(e)]StreamTokenizer: ne reconnait pas les floats!!
    Par doudine dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 10/12/2004, 17h28
  3. [HARDWARE] Graveur DVD ne reconnait pas des DVD
    Par Yepazix dans le forum Périphériques
    Réponses: 2
    Dernier message: 30/11/2004, 15h22
  4. Installation : ne reconnait pas le CDROM
    Par SebCBien dans le forum Matériel
    Réponses: 4
    Dernier message: 08/08/2004, 17h10
  5. Réponses: 4
    Dernier message: 24/03/2004, 12h37

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