Ich versuche, ein Projekt mit boost::asio::spawn
Koroutinen umzuschreiben. Einige Teile des Projekts können nicht geändert werden. Zum Beispiel wird die Speicherprotokollbibliothek auch mit boost::asio
geschrieben, aber ohne Coroutinen.boost :: asio :: spawn Ausbeute als Rückruf
Das Problem ist, wie yield_context
in einen normalen Callback (ein boost::function
Objekt oder einen klassischen Funktor) konvertieren.
Dies ist, was wir in der Speicherbibliothek API haben:
my_socket.async_read_some(boost::asio::buffer(data), yield);
ein boost::asio::yield_context
In diesem Fall:
void async_request_data(uint64_t item_id, boost::function< void(Request_result *) > callback);
Wie wir aus den Beispielen kennen, kann der Asio Ausbeute Kontext wie folgt verwendet werden Objekt dient als Rückruf für async_read_some. Ich würde gerne ein Ergebnis Objekt als zweites Argument zu async_request_data
übergeben, so dass ich es in einer synchronen Weise verwenden kann.
Wie kann das gemacht werden? Ich denke, dass es möglich sein kann über ein Proxy-Objekt, möglicherweise unter Verwendung eines Ansatzes basierend auf asio_handler_invoke. Aber ich habe Schwierigkeiten zu sehen, wie das geht.
Sicher, ich brauche einig Proxy-Objekt, um es als Rückruf passieren, aber es ist nicht klar, wie man schreibt der Mut dieses Objekts. 'yield_context' hat kein' operator() '(sonst würde es" wie es ist "ohne Proxy funktionieren). Es hat einige Eingeweide, die hier beschrieben werden http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/basic_yield_context/basic_yield_context.html, aber es ist nicht klar, wie man sie kombiniert, um eine korrekte Coroutine-Resume zu machen . – PSIAlt
Ich denke 'Handler' ** ist ** das Proxy-Objekt. Bitte siehe bearbeiten. –
Es hat mit ein paar kleinen Änderungen funktioniert! Danke für die Wegbeschreibung! (Ich schrieb den endgültigen Code in einer anderen Antwort) – PSIAlt