2011-02-25 3 views
5

Il y a un aspect des minuteurs dans les connexions asynchrones que je veux savoir si je comprends bien. Supposons que nous définissions une minuterie avant d'effectuer une opération de lecture, qui inclut un gestionnaire, puis run() le service io_0.Quelques éclaircissements nécessaires abous Boost asio opérations asynchrones et minuteries

Comme je l'ai compris, le io_service se termine dès que le gestionnaire se termine après avoir été invoqué, qui peut se produire pour deux raisons:

a) l'opération de lecture est terminée. B) le temporisateur a atteint sa limite. Supposons que la première condition (a) ait été atteinte et que l'opération de lecture ait été achevée avant la fin de la temporisation.

La question est: Qu'advient-il de cette minuterie? Avons-nous besoin de le finir. Dites

dTimer_.expires_from_now (boost::posix_time::seconds(0)); 

after the io_service.run()? 

Pouvez-vous le réinitialiser à un nouvel intervalle si nécessaire réutiliser le même objet temporisateur pour une autre opération de lecture? Puis-je réinitialiser() le service IO et réutiliser le même objet dans un nouveau run() pour cette nouvelle opération?

Répondre

8

The question is: What happens to that timer? Do we need to finish it.

si vous ne cancel il

void my_read_handler() { 
    dTimer_.cancel(); // remember to catch exceptions 
} 

Le async_wait handler sera passé un error code de boost::asio::error::operation_aborted si elle a été annulée avec succès sera toujours appelé gestionnaire de la minuterie. Si le async_wait terminé avant le cancel et le gestionnaire a déjà été mis en file d'attente par le io_service, votre gestionnaire devra détecter cette condition et réagir de manière appropriée.


Can you reset it to a new interval if necessary re-use the same timer object for another read operation?

A deadline_timer peut être reset utilisant expires_from_now

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the boost::asio::error::operation_aborted error code.


Can I reset() the io_service and reuse the same object in a new run() for that new operation?

Le même objet io_service peut être utilisé à nouveau pour run() ou poll() après resetting elle.

This function must be called prior to any second or later set of invocations of the run(), run_one(), poll() or poll_one() functions when a previous invocation of these functions returned due to the io_service being stopped or running out of work. This function allows the io_service to reset any internal state, such as a "stopped" flag.

+0

réponse complète, + 1 pour boost :: asio :: error :: operation_aborted – Ralf

+0

Merci beaucoup pour votre explication claire et nette du processus en cause, mais encore une question: en supposant que mon premier scénario, s'il est une opération de lecture et une minuterie, le io_service se termine-t-il lorsque le premier est terminé? l'ancien? ou les deux? –

+0

@Old newbie 'io_service :: run()' retourne le contrôle à l'appelant quand il n'y a plus de travail à faire, cela est bien décrit dans la [documentation] (http://www.boost.org/doc/libs/1_46_0 /doc/html/boost_asio/reference/io_service/run/overload1.html). Dans votre contexte, cela signifie que tous les gestionnaires en attente, 'async_read' et' async_wait', seront invoqués avant d'être renvoyés. –