2013-03-13 1 views
2

Par défaut, GetTickCount et timeGetTime ont la même résolution - 15.625ms, mais après avoir appelé timeBeginPeriod (1), GetTickCount met à jour toutes les 15.625 ms, tandis que timeGetTime se met à jour toutes les 1ms, Pourquoi est-ce?Pourquoi GetTickCount et timeGetTime ont une résolution différente?

En Bug in waitable timers?, l'auteur a mentionné que:

RTC based timer

Je me demande que: Pourquoi GetTickCount et timeGetTime proviennent de la même RTC, mais il existe deux types de résolution?

merci!

+0

Lecture connexe: http://blogs.msdn.com/b/larryosterman/archive/2009/09/02/what-s-the-difference-between-gettickcount-and-timegettime .aspx –

+0

Je ne comprends pas, pourquoi diable voudriez-vous que deux fonctions * winapi * différentes * se comportent de la même façon? Si c'était * conçu * pour être le même que bien sûr, il n'aurait pas été nécessaire d'ajouter une fonction séparée. –

+0

@CodyGray merci pour votre information. Comme l'auteur l'a mentionné: "KeGetTickCount obtient le nombre de ticks, KeQueryInterruptTime obtient le compte de temps d'interruption". Quelle est la différence entre le nombre de tiques et le nombre de temps d'interruption? Je suis perplexe que combien de minuterie basée utilise Windows? – ajaxhe

Répondre

0

Je pense que l'OP est confus entre les minuteurs, les interruptions et les ticks de minuterie.

L'intervalle quantique est la période de la tique de la minuterie. Ceci est câblé dans le système à 18,2 ticks/sec. Cela ne varie jamais pour une raison quelconque, et n'est pas basé sur l'horloge de l'unité centrale du système (évidemment!).

Vous pouvez demander au système 2 choses différentes: la date et l'heure, (GetTime) ou la durée d'exécution du système (GetTickCount/GetTickCount64).

Si vous êtes intéressé par la disponibilité du système, utilisez GetTickCount. De ma compréhension limitée, GetInterruptTime renvoie uniquement la quantité de temps passé pendant les interruptions en temps réel (par opposition au temps passé à exécuter des applications ou inactif).

Je ne suis pas sûr que dire à un nouveau programmeur d'arrêter de demander "pourquoi?" va les aider. Oui, le PO n'a pas vu ou lu les commentaires sur la page mentionnée; mais demander ici ne devrait pas être un privilège accordé uniquement aux chercheurs qui ont épuisé toutes les autres voies (y compris éventuellement les Pierres de Seeing de C). Nous apprenons tous ici. Cessez de dire aux gens que leur question est inutile sans leur dire pourquoi. Et il n'y a aucune raison de ne pas demander. Les timers peuvent être déroutants!

1

En fait, la table que vous citez est fausse pour QueryPerformanceCounter. QPC (pour faire court) est implémenté en termes de 3 sources de temporisation possibles, à savoir 1: HPET, 2: MPI timer minuterie, 3: RDTSC. la décision est prise par heuristique en fonction des conditions, des options de démarrage du noyau, des bogues dans le BIOS et des bogues dans le code ACPI fourni par le chipset. Tous ces bogues sont découverts sur une base matérielle dans les laboratoires Microsoft. Les programmeurs Linux et BSD doivent trouver eux-mêmes la solution et doivent généralement réécrire le code ACPI pour éviter les chutes. La communauté Linux a fini par détester le RDTSC et beaucoup l'ACPI pour différentes raisons. Mais quoi qu'il en soit ...

Le paramètre timeReadTime est différent de GetTickCount car pour des raisons de stabilité, en fonction de la manière dont la documentation spécifiée par GetTickCount a été créée, son comportement n'a pas pu être modifié. Toutefois, les fenêtres nécessaires pour obtenir une meilleure résolution Tick dans certains cas pour permettre de meilleures fonctions de minuterie. (la minuterie fonctionne avec les messages envoyés à la fonction GetMessage ou PeekMessage de l'application, puis se branche dans le bon rappel pour gérer le minuteur) Ceci est nécessaire pour le multimédia comme la synchronisation audio/son.

De toute évidence, la programmation en jeu ou en temps réel nécessite une meilleure précision même parfois et ne peut pas utiliser de minuterie. Au lieu de cela, ils utilisent l'attente occupée, ou ils ne dorment qu'une seule fois: le VSync via un appel à OpenGL ou DirectX uppon backbuffer/frontbuffer swapping. Le pilote vidéo réveillera le signal d'attente VSync du fil d'attente en provenance de l'écran lui-même. Qui est un sommeil basé sur un événement, comme une minuterie, mais pas basé sur une interruption de minuterie.

Il est à noter que les noyaux modernes ont un ticking dynamique (noyau tickless, à partir de windows 8 ou linux 2.6.18). La fréquence d'interruption de tique la plus fine ne peut pas être inférieure à 1 ms pour éviter de s'étouffer, mais il n'y a pas de limite supérieure. Si aucune application n'est en cours d'exécution et ne stocke l'événement de temporisation, la machine peut rester en veille indéfiniment, ce qui permet au processeur de passer à l'état de veille le plus profond (état Intel Enhanced Speed ​​Step C7). Après quoi, l'événement de réveil suivant, la plupart du temps, se produit à cause d'une interruption de l'appareil, principalement USB. (déplacement de la souris ou autre)

Questions connexes