Boost C++ Libraries/Boost.Asio

Boost.Asio 튜토리얼 - Timer.4 - 핸들러로 멤버 함수를 사용

까마귀75 2020. 12. 15. 14:31
728x90
반응형

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 - 멀티스레드 프로그램에서 핸들러 동기화

원본 링크

728x90
반응형