Il y a une ligne dans le 3ème tutoriel sur Boost asio qui montre comment renouveler un timer tout en évitant qu'il ne dérive. La ligne est la suivante:Besoin d'explication pour ce boost :: asio timer exemple
t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
Peut-être que c'est moi, mais je ne pouvais trouver de la documentation sur la 2ème utilisation des e xpires_at()
, sans paramètre. expires_at(x)
définit la nouvelle expiration, annulant tous les gestionnaires d'achèvement en attente. Donc, probablement expires_at() fait quoi, l'heure de retour de la dernière expiration? Donc, en ajoutant une seconde, s'il y a un certain nombre de ms, disons n ms, alors il sera essentiellement "soustrait" de l'expiration suivante puisque le temps est pris en compte? Que se passe-t-il alors si le temps nécessaire à l'exécution de ce gestionnaire est supérieur à 1 seconde dans cet exemple? Est-ce qu'il tire immédiatement? Expires_at() renvoie l'heure à laquelle il est défini sur le délai d'expiration.
Je ne suis pas certain de comprendre votre première phrase. expires_at() renvoie un temps posix (dans ce cas posix). mais dans cette ligne de code, il est exécuté * dans * le gestionnaire de complétion, donc l'expiration est dans le passé (vient de se produire il y a un instant). Donc si je comprends l'effet est que vous ajoutez l'heure dans le passé avec 1 seconde, ce qui explique le temps que vous prenez * maintenant * pour faire le gestionnaire d'achèvement (quel que soit le code précédé cette ligne). C'est ainsi que la dérive est évitée non? Sinon, vous ajoutez 1 seconde + le temps qu'il a fallu pour exécuter le code précédant cette ligne? – ApplePieIsGood
Cela ajoutera 1 seconde à l'heure à laquelle il était supposé appeler le gestionnaire. Donc, si vous avez un délai pour une raison quelconque avant d'entrer dans le gestionnaire, il faut moins d'une seconde avant de pouvoir à nouveau appeler le gestionnaire. Ou dans le cas particulier, il le mettra simplement dans la file d'attente car il aurait déjà dû être manipulé, car il a fallu trop de temps pour atteindre ce code. Si vous pensez que le risque est faible, vous devriez peut-être utiliser expires_from_now (x) à la place pour définir 1s à partir de maintenant. – jpyllman