Timer.3 - 핸들러에 대한 바인딩 인수 (Binding arguments to a handler)
이 튜토리얼에서는 타이머가 초당 한번 발생하도록 튜토리얼 Timer.2의 프로그램을 수정할 것이다. 여기서 핸들러 함수에 추가 파라미터를 전달하는 방법을 보여줄 것이다.
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>
asio를 사용하여 반복 타이머를 구현하려면, 콜백 함수에서 타이머의 만료 시간을 변경한 다음에 신규 비동기 대기를 시작해야 한다. 분명히 이것은 콜백 함수가 타이머 개체에 접근할 수 있어야 한다는 것을 의미한다. 이를 위해 print 함수에 두 개의 신규 파라미터를 추가한다.
- 타이머 개체에 대한 포인터
- 타이머가 여섯 번째 발생될 때 프로그램을 중지할 수 있는 카운터
void print(const boost::system::error_code& /*e*/,
boost::asio::steady_timer* t, int* count)
{
위에서 언급한 대로, 이 튜토리얼 프로그램은 타이머가 여섯 번째 발생될 때 실행을 중지하기 위해 카운터를 사용한다. 그러나 io_context를 중지하도록 요청하는 명시적인 호출이 없다는 것을 알게 될 것이다. 튜토리얼 Timer.2에서 io_context::run() 함수가 더 이상 "work(작업)"이 없을 때 완료된다는 것을 기억할 것이다. count가 5에 도달하면 타이머에서 더 이상 신규 비동기 대기를 시작하지 않으면, io_context는 작업이 부족해지고 실행을 중지할 것이다.
if (*count < 5)
{
std::cout << *count << std::endl;
++(*count);
다음으로 타이머의 만료 시간을 이전 만료 시간에서 일초만큼 이동한다. (이전 만료 시간에서 일초를 더한다.) 이전과 비교하여 새로운 만료 시간을 계산함으로써, 핸들러 처리 지연으로 인해 타이머가 전체-초 표시에서 이탈하지 않도록 할 수 있다.
t->expires_at(t->expiry() + boost::asio::chrono::seconds(1));
그런 다음 타이머에서 신규 비동기 대기를 시작한다. 보다시피, boost::bind() 함수는 콜백 핸들러와 추가 파라미터를 연결하는 데 사용된다. steady_timer::async_wait() 함수는 void(const boost::system::error_code&) 서명이 있는 핸들러 함수(또는 함수 개체)를 기대한다. 추가 파라미터를 바인딩하면 print 함수는 서명과 정확하게 일치하는 함수 개체로 변환된다.
boost::bind() 사용방법에 대한 자세한 내용은 Boost.Bind 문서를 참조한다.
이 예제에서, boost::bind()에 대한 boost::asio::placeholders::error 인수는 핸들러에 전달된 오류 개체에 대한 명명된 placeholder이다. 비동기 작업을 시작할 때, boost::bind()를 사용하는 경우 핸들러의 파라미터 목록과 일치하는 인수만 지정해야 한다. Timer.4 튜토리얼에서 콜백 핸들러에서 파라미터가 필요하지 않은 경우, 이 대체자(placeholder)가 제거될 수 있음을 알 수 있다.
t->async_wait(boost::bind(print,
boost::asio::placeholders::error, t, count));
}
}
int main()
{
boost::asio::io_context io;
타이머가 여섯 번째로 발생되면 프로그램을 중지할 수 있도록 새로운 count 변수가 추가된다.
int count = 0;
boost::asio::steady_timer t(io, boost::asio::chrono::seconds(1));
4단계에서와 같이, main에세 steady_timer::async_wait()를 호출할 때 print 함수에 필요한 추가 파라미터를 바인딩한다.
t.async_wait(boost::bind(print,
boost::asio::placeholders::error, &t, &count));
io.run();
마지막으로, print 핸들러 함수에 count 변수가 사용되었다는 것을 증명하기 위해 새로운 값을 출력한다.
std::cout << "Final count is " << count << std::endl;
return 0;
}
전체 소스 보기
돌아가기: 튜토리얼 페이지
이전: Timer.2 - 타이머를 비동기식으로 사용
다음: Timer.4 - 핸들러로 멤버 함수를 사용
원본 링크
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 튜토리얼 - Timer.4 - 핸들러로 멤버 함수를 사용 (0) | 2020.12.15 |
---|---|
Boost.Asio 튜토리얼 - Timer.3 소스 (0) | 2020.12.15 |
Boost.Asio 튜토리얼 - Timer.2 소스 (0) | 2020.12.15 |
Boost.Asio 튜토리얼 - Timer.1 소스 (0) | 2020.12.15 |
Boost.Asio 튜토리얼 - Timer.2 - 타이머를 비동기식으로 사용 (0) | 2020.12.15 |