/** * \brief Perform system experiment. */ public: void run() { typedef typename app_experiment_container::const_iterator app_experiment_iterator; // typedef typename monitor_container::const_iterator monitor_iterator; DCS_DEBUG_TRACE( "BEGIN Execution of System EXPERIMENT" ); app_experiment_iterator app_exp_end_it(app_exps_.end()); app_experiment_iterator app_exp_beg_it(app_exps_.begin()); (*p_sta_sig_)(*this); if (app_exp_beg_it != app_exp_end_it) { // There is some experiment to run ::boost::thread_group exp_thds; // Create threads for application experiments for (app_experiment_iterator app_exp_it = app_exp_beg_it; app_exp_it != app_exp_end_it; ++app_exp_it) { app_experiment_pointer p_app_exp(*app_exp_it); detail::runnable<app_experiment_type> exp_runner(*app_exp_it); //::boost::thread exp_thd(exp_runner); exp_thds.create_thread(exp_runner); //::boost::this_thread::sleep_for(::boost::chrono::seconds(2)); } // // Create threads for experiment monitors // system_experiment_context<traits_type> ctx(this); // monitor_iterator mon_end_it(mons_.end()); // for (monitor_iterator mon_it = mons_.begin(); // mon_it != mon_end_it; // ++mon_it) // { // monitor_pointer p_mon(*mon_it); // // detail::monitor_runnable<monitor_type> mon_runner(p_mon, ctx); // exp_thds.create_thread(mon_runner); // } running_ = true; exp_thds.join_all(); running_ = false; } (*p_sto_sig_)(*this); DCS_DEBUG_TRACE( "END Execution of System EXPERIMENT" ); }
public: void track(sys_experiment_type& exp) { exp.add_on_start_handler(::boost::bind(&self_type::on_start, this, ::_1)); ::std::vector<app_experiment_pointer> app_exps(exp.experiments()); for (::std::size_t i = 0; i < app_exps.size(); ++i) { app_experiment_pointer p_app_exp(app_exps[i]); p_app_exp->add_on_start_handler(::boost::bind(&self_type::on_app_start, this, ::_1)); p_app_exp->manager().add_on_sample_handler(::boost::bind(&self_type::on_app_sample, this, *p_app_exp, ::_1)); p_app_exp->manager().add_on_control_handler(::boost::bind(&self_type::on_app_control, this, *p_app_exp, ::_1)); p_app_exp->add_on_stop_handler(::boost::bind(&self_type::on_app_stop, this, ::_1)); } exp.add_on_stop_handler(::boost::bind(&self_type::on_stop, this, ::_1)); }