[boost.Asio tutorial] Binding arguments to a handler

2019. 8. 14. 00:11PL/C++

이번 튜토리얼에서는 Using a timer asynchronousl 예제를 수정해서, 핸들러 함수에 추가적인 파라미터를 넣어줘서 1초에 한 번씩 수행하는 연속적인 프로그램을 만드려고 한다. 반복적인 타이머를 구현하기 위해서 콜백 함수에 타이머 재설정이 필요하다. 타이머 조작을 위해서는 타이머 객체가 필요한데 이를 매개변수로 전달하려고 한다

 

count가 5에 도달했어도 타이머가 종료되는 코드가 없지만, io.run에 의해서 비동기 타이머가 없다면 io_service가 종료되게 된다. 그리고 bind 함수를 눈에 띄게 봐야하는데, 아직까진 정확한 용도는 파악되지 않았지만 함수와 매개변수를 묶어서 전달할 때 쓰이는 것으로 보인다.

 

bind(함수명, 매개변수1, 매개변수2, 매개변수3)

 

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

using namespace std;

void print(const boost::system::error_code&,
	boost::asio::deadline_timer *t, int *count) 
{
	if (*count < 5) {
		cout << *count << '\n';
		++(*count);

		t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
		t->async_wait(boost::bind(print,
			boost::asio::placeholders::error, t, count));
	}
}

int main(void) {
	boost::asio::io_context io;

	int count = 0;
	boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
	t.async_wait(boost::bind(print,
		boost::asio::placeholders::error, &t, &count));

	io.run();
	cout << "Final count is " << count << '\n';
	return 0;
}

 

[출처] https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/tutorial/tuttimer3.html