Jpp  17.1.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
data_input_interface.hh
Go to the documentation of this file.
1 #ifndef DATA_INPUT_INTERFACE_HH
2 #define DATA_INPUT_INTERFACE_HH
3 
4 #include <cassert>
5 #include <vector>
6 
7 #include <boost/asio.hpp>
8 #include <boost/thread.hpp>
9 #include <boost/foreach.hpp>
10 #include <boost/scoped_ptr.hpp>
11 
12 #include "input_channel_handler.hh"
13 
14 /**
15  * \author cpellegrino
16  */
17 
19 {
22  boost::asio::io_service m_service;
23  boost::scoped_ptr<boost::thread_group> m_threads;
24 
25  public:
26 
27  DataInputInterface(size_t number_of_workers = 1)
28  :
29  m_number_of_workers(number_of_workers),
30  m_threads(0)
31  {}
32 
34  {
35  stop();
36  for (size_t i = 0; i < m_channel_handlers.size(); ++i)
37  {
38  delete m_channel_handlers[i];
39  }
40  }
41 
42  void stop()
43  {
44  m_service.stop();
45 
46  if (m_threads)
47  {
48  m_threads->join_all();
49  }
50 
51  m_threads.reset();
52  }
53 
54  void pause()
55  {
56  BOOST_FOREACH(InChannelHandler* h, m_channel_handlers)
57  {
58  h->pause();
59  }
60  }
61 
62  void cont()
63  {
64  BOOST_FOREACH(InChannelHandler* h, m_channel_handlers)
65  {
66  h->cont();
67  }
68  }
69 
70  void start()
71  {
72  assert(!m_threads && "Calling DataInputInterface::start() on started istance.");
73 
74  m_threads.reset(new boost::thread_group);
75  m_service.reset();
76  for (std::size_t i = 0; i < m_number_of_workers; ++i)
77  {
78  m_threads->create_thread(boost::bind(&boost::asio::io_service::run,
79  &m_service));
80  }
81  }
82 
83  void add_worker()
84  {
85  if (m_threads)
86  {
87  m_threads->create_thread(boost::bind(&boost::asio::io_service::run,
88  &m_service));
89  }
90 
92  }
93 
94  void add_channel(unsigned short port, FrameFarm& farm)
95  {
96  InChannelHandler* new_channel = new InChannelHandler(m_service, port, farm);
97  m_channel_handlers.push_back(new_channel);
98  }
99 };
100 
101 #endif // INPUT_INTERFACE_HH
void add_channel(unsigned short port, FrameFarm &farm)
DataInputInterface(size_t number_of_workers=1)
boost::asio::io_service m_service
boost::scoped_ptr< boost::thread_group > m_threads
std::vector< InChannelHandler * > m_channel_handlers