Próbuję przerobić projekt przy użyciu coroutines boost::asio::spawn
. Niektórych części projektu nie można zmienić. Na przykład biblioteka protokołów magazynowania jest również zapisana pod numerem boost::asio
, ale bez coroutines.boost :: asio :: spawn yield jako callback
Problem polega na przekształceniu yield_context
w zwykłe wywołanie zwrotne (obiekt boost::function
lub klasyczny funktor).
To co mamy w API biblioteki Przechowywanie:
void async_request_data(uint64_t item_id, boost::function< void(Request_result *) > callback);
Jak wiemy z przykładach asio kontekst wydajność mogą być używane tak:
my_socket.async_read_some(boost::asio::buffer(data), yield);
W tym przypadku boost::asio::yield_context
Obiekt służy jako wywołanie zwrotne dla async_read_some. Chciałbym przekazać obiekt yield jako drugi argument do async_request_data
, więc mogę go używać w sposób synchroniczny.
Jak można tego dokonać? Myślę, że może to być możliwe za pośrednictwem jakiegoś obiektu proxy, prawdopodobnie za pomocą podejścia opartego na asio_handler_invoke. Ale mam problem z zobaczeniem, jak to zrobić.
Na pewno muszę jakiś obiekt proxy, aby przekazać go jako zwrotnego, ale nie jest jasne, w jaki sposób napisać wnętrzności tego obiektu. 'yield_context' nie ma' operator() '(inaczej działałoby" tak jak jest "bez proxy). Ma pewne odwagi opisane tutaj: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/basic_yield_context/basic_yield_context.html, ale nie jest jasne, jak je połączyć, aby uzyskać poprawne CV Coroutine . – PSIAlt
Myślę, że 'handler' ** jest ** obiektem proxy. Pls patrz edit. –
To działało z niewielkimi zmianami! Dzięki za wskazówki! (Napisałem ostatni kod w innej odpowiedzi) – PSIAlt