Quelle est la précision du sumil () ou du sumil ()

J’essaie de simuler une action clé en haut et clé en haut.

Par exemple: 2638 millisecondes.

SendMessage(hWnd, WM_KEYDOWN, keyCode, 0); Sleep(2638); SendMessage(hWnd, WM_KEYUP, keyCode, 0); 

Comment sauriez-vous si cela a vraiment fonctionné?

Vous ne le feriez pas avec ce code, car mesurer avec précision le temps nécessaire à l’exécution du code est une tâche difficile.

Pour arriver à la question posée par le titre de votre question (vous devriez vraiment poser une question à la fois …), la précision desdites fonctions est dictée par le système d’exploitation. Sous Linux, la granularité de l’horloge système est de 10 ms. Par conséquent, la suspension de processus chronométrée via nanosleep () est garantie à une précision de 10 ms. Même dans ce cas, il n’est pas garanti de dormir pendant exactement l’heure spécifiée. (Voir ci-dessous.)

Sous Windows, la granularité de l’horloge peut être modifiée pour répondre aux besoins en matière de gestion de l’alimentation (par exemple, diminuez la granularité pour économiser la batterie). Consultez la documentation de MSDN sur la fonction de veille .

Notez qu’avec Sleep () / nanosleep (), le système d’exploitation ne garantit que la suspension du processus durera au moins aussi longtemps que vous le spécifiez. L’exécution d’autres processus peut toujours retarder la reprise de votre processus.

Par conséquent, l’événement key-up envoyé par votre code ci-dessus sera envoyé au moins 2,638 secondes plus tard que l’événement key-down, et pas une milliseconde plus tôt. Mais il serait possible que l’événement soit envoyé 2,7, 2,8, voire 3 secondes plus tard. (Ou bien plus tard si un processus en temps réel s’empare du processeur et n’abandonne pas le contrôle pendant un certain temps.)

Sleep fonctionne en termes de planification de threads Windows standard. Il est précis jusqu’à environ 20 à 50 millisecondes.

Pour que les choses dépendent de l’expérience utilisateur. Cependant, c’est totalement inapproprié pour les choses en temps réel.

À côté de cela, il existe de bien meilleurs moyens de simuler des événements clavier / souris. Veuillez voir SendInput .

La fonction sleep () revient avant le délai souhaité lorsque le délai demandé est inférieur au délai restant avant la prochaine interruption. Toutefois, cela indique uniquement que vous souhaitez dormir pendant une période plus courte que celle actuellement prise en charge par votre système. Il est conseillé de configurer la ressource de timer multimédia sur une fréquence d’interruption plus élevée afin d’obtenir une meilleure correspondance du délai de veille observé par rapport au délai souhaité.

Les commentaires dans les discussions suivantes:

Comment obtenir une timer précise de 1 ms sous WinXP

Dormez moins d’un milliseconde

La commande Sleep () s’assurera que le thread est suspendu au moins la durée donnée en argument. Le système d’exploitation ne le garantit pas. Pour une discussion détaillée, vous pouvez vous reporter à l’article ci-dessous. Comment le sumil est-il mis en œuvre au niveau du système d’exploitation?