Timer.4 - 핸들러로 멤버 함수를 사용 (Using a member function as a handler)
이 튜토리얼에서는 클래스 멤버 함수를 콜백 핸들러로 사용하는 방법을 볼 것이다. 이 프로그램은 튜토리얼 Timer.3에 있는 튜토리얼 프로그램과 동일하게 실행되어야 한다.
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>
이전 튜토리얼 프로그램에서 했던 것처럼, 사용가능한 print를 콜백 핸들러로 정의하는 대신에 이제는 printer라는 클래스를 정의한다.
class printer
{
public:
이 클래스의 생성자는 io_context의 객체에 대한 참조를 가져와서 timer_ 멤버를 초기화할 때 사용한다. 프로그램을 종료하는 데 사용되는 카운터 역시 이제는 클래스 멤버이다.
printer(boost::asio::io_context& io)
: timer_(io, boost::asio::chrono::seconds(1)),
count_(0)
{
boost::bind() 함수는 사용가능한 함수와 마찬가지로 클래스 멤버 함수에서도 잘 작동한다. 모든 비-정적 클랙스 멤버 함수에는 암시적 this 파라미터가 있으므로 이를 함수에 바인딩해야 한다. 튜토리얼 Timer.3에서와 같이, boost::bind()는 콜백 핸들러(현재의 멤버 함수)를 void(const boost::system::error_code&) 서명이 있는 것처럼 호출될 수 있는 함수 객체로 변환한다.
boost::asio::placeholders::error 대체자(placeholder)는 print 멤버 함수에서 파라미터로 오류 개체를 허용하지 않기 때문에 여기서 지정되지 않은 점에 유의한다.
timer_.async_wait(boost::bind(&printer::print, this));
}
클래스 소멸자에서 카운터의 최종 값을 출력한다.
~printer()
{
std::cout << "Final count is " << count_ << std::endl;
}
print 멤버 함수는 타이머와 카운터를 파라미터로 전달하는 대신 클래스의 데이터 멤버에서 작동한다는 점을 제외하면 튜토리얼 Timer.3의 print 함수와 매우 유사하다.
void print()
{
if (count_ < 5)
{
std::cout << count_ << std::endl;
++count_;
timer_.expires_at(timer_.expiry() + boost::asio::chrono::seconds(1));
timer_.async_wait(boost::bind(&printer::print, this));
}
}
private:
boost::asio::steady_timer timer_;
int count_;
};
평상시대로 io_context를 실행하기 전에 로컬 printer 개체를 선언하므로 main 함수가 이전보다 훨씬 간단해졌다.
int main()
{
boost::asio::io_context io;
printer p(io);
io.run();
return 0;
}
전체 소스 보기
돌아가기: 튜토리얼 페이지
이전: Timer.3 - 핸들러에 대한 바인딩 인수
다음: Timer.5 - 멀티스레드 프로그램에서 핸들러 동기화
원본 링크
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 튜토리얼 - Timer.5 - 멀티스레드 프로그램에서 핸들러 동기화 (0) | 2020.12.15 |
---|---|
Boost.Asio 튜토리얼 - Timer.4 소스 (0) | 2020.12.15 |
Boost.Asio 튜토리얼 - Timer.3 소스 (0) | 2020.12.15 |
Boost.Asio 튜토리얼 - Timer.3 - 핸들러에 대한 바인딩 인수 (0) | 2020.12.15 |
Boost.Asio 튜토리얼 - Timer.2 소스 (0) | 2020.12.15 |