boost :: asio :: spawn yield as callback

PSIAlt

boost::asio::spawn코 루틴을 사용하여 프로젝트를 다시 작성하려고합니다 . 프로젝트의 일부는 변경할 수 없습니다. 예를 들어 스토리지 프로토콜 라이브러리도으로 작성 boost::asio되지만 코 루틴은 없습니다.

문제는 yield_context일반 콜백 ( boost::function객체 또는 클래식 펑터) 으로 변환하는 방법 입니다.

다음은 스토리지 라이브러리 API에있는 것입니다.

void async_request_data(uint64_t item_id, boost::function< void(Request_result *) > callback);

예제에서 알 수 있듯이 asio yield 컨텍스트는 다음과 같이 사용할 수 있습니다.

    my_socket.async_read_some(boost::asio::buffer(data), yield);

이 경우 boost::asio::yield_context객체는 async_read_some 의 콜백 역할을합니다 . 대한 두 번째 인수로 yield 객체 를 전달 async_request_data하여 동기식으로 사용할 수 있습니다.

어떻게 할 수 있습니까? asio_handler_invoke 기반의 접근 방식을 사용하여 프록시 개체를 통해 가능할 수 있다고 생각합니다 . 그러나 나는 이것을하는 방법을 보는 데 어려움을 겪고 있습니다.

프리 커피

이 기능에 대한 최고의 문서는 boost asio 작성자가 작성한 C ++ 표준 제안에서 찾을 수 있습니다.

N4045 – 비동기 작업을위한 라이브러리 기초, 개정판 2

섹션 9.1을 참조하십시오.

handler_type_t<CompletionToken, void(error_code, size_t)>   #3
  handler(std::forward<CompletionToken>(token));

3 : 완료 토큰은 처리기로 변환됩니다. 즉, 비동기 작업이 완료 될 때 호출되는 함수 개체입니다. 서명은 핸들러에 전달 될 인수를 지정합니다.

나는 귀하의 경우 추측 CompletionToken템플릿 인수가 실제로있을 것입니다 boost::asio::yield_contexthandler_type콜백 객체로 변환이.


async_request_data함수 를 호출하기 위해 업데이트 된 섹션 9.1의 코드는 다음과 같습니다 .

template <class CompletionToken>
auto async_foo(uint64_t item_id, CompletionToken&& token)
{
  handler_type_t<CompletionToken, void(Request_result *)>
    handler(std::forward<CompletionToken>(token));

  async_result<decltype(handler)> result(handler);  

  async_request_data(item_id, handler);

  return result.get();  
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

boost :: asio :: spawn이 BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT로 중단됩니까?

분류에서Dev

boost :: asio :: spawn을 위해 io_context를 언제 전달해야합니까? (C ++)

분류에서Dev

Dummy ASIO service callback?

분류에서Dev

Create timer with boost::asio

분류에서Dev

boost :: asio :: spawnにio_contextを渡す必要があるのはいつですか?(C ++)

분류에서Dev

내 자신의 함수를 통해 boost :: asio :: yield_context를 전달하는 방법은 무엇입니까?

분류에서Dev

취소 할 때 boost :: asio :: yield_context를 deadline_timer 핸들러로 사용할 수 있습니까?

분류에서Dev

Redux Saga-yield spawn takeEvery call no overload

분류에서Dev

boost :: asio의 Valgrind 오류

분류에서Dev

Taking the port from Boost Asio socket

분류에서Dev

`boost :: asio :: streambuf`에서 파생

분류에서Dev

boost :: asio :: yield_context를 사용하는 클래스를 단위 테스트하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

yield [ec] 대신 asio use_future

분류에서Dev

boost :: asio 데이터 소유`ConstBufferSequence`

분류에서Dev

boost :: asio :: read () 블록을 영원히

분류에서Dev

Clear boost::asio::io_service after stop()

분류에서Dev

C ++ Boost.Asio 개체 수명

분류에서Dev

Boost asio가 HTTP POST를 받습니까?

분류에서Dev

boost_1_55_0 asio 연결

분류에서Dev

"2 단계"async_read with boost asio

분류에서Dev

"2 단계"async_read with boost asio

분류에서Dev

Boost ASIO로 예외 처리 향상

분류에서Dev

boost :: asio :: serial_port 및 RTS 핀

분류에서Dev

boost :: asio 읽기 / 쓰기 문제

분류에서Dev

Boost ASIO에서 콜백 취소

분류에서Dev

Boost :: Asio-read 또는 read_until?

분류에서Dev

ASIO handler arguments and boost::bind, compile time error

분류에서Dev

Boost 및 asio로 스레드 실행

분류에서Dev

boost :: asio 쓰기 : 깨진 파이프

Related 관련 기사

  1. 1

    boost :: asio :: spawn이 BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT로 중단됩니까?

  2. 2

    boost :: asio :: spawn을 위해 io_context를 언제 전달해야합니까? (C ++)

  3. 3

    Dummy ASIO service callback?

  4. 4

    Create timer with boost::asio

  5. 5

    boost :: asio :: spawnにio_contextを渡す必要があるのはいつですか?(C ++)

  6. 6

    내 자신의 함수를 통해 boost :: asio :: yield_context를 전달하는 방법은 무엇입니까?

  7. 7

    취소 할 때 boost :: asio :: yield_context를 deadline_timer 핸들러로 사용할 수 있습니까?

  8. 8

    Redux Saga-yield spawn takeEvery call no overload

  9. 9

    boost :: asio의 Valgrind 오류

  10. 10

    Taking the port from Boost Asio socket

  11. 11

    `boost :: asio :: streambuf`에서 파생

  12. 12

    boost :: asio :: yield_context를 사용하는 클래스를 단위 테스트하는 가장 좋은 방법은 무엇입니까?

  13. 13

    yield [ec] 대신 asio use_future

  14. 14

    boost :: asio 데이터 소유`ConstBufferSequence`

  15. 15

    boost :: asio :: read () 블록을 영원히

  16. 16

    Clear boost::asio::io_service after stop()

  17. 17

    C ++ Boost.Asio 개체 수명

  18. 18

    Boost asio가 HTTP POST를 받습니까?

  19. 19

    boost_1_55_0 asio 연결

  20. 20

    "2 단계"async_read with boost asio

  21. 21

    "2 단계"async_read with boost asio

  22. 22

    Boost ASIO로 예외 처리 향상

  23. 23

    boost :: asio :: serial_port 및 RTS 핀

  24. 24

    boost :: asio 읽기 / 쓰기 문제

  25. 25

    Boost ASIO에서 콜백 취소

  26. 26

    Boost :: Asio-read 또는 read_until?

  27. 27

    ASIO handler arguments and boost::bind, compile time error

  28. 28

    Boost 및 asio로 스레드 실행

  29. 29

    boost :: asio 쓰기 : 깨진 파이프

뜨겁다태그

보관