#include "../test.h" SCENARIO("schedule_periodically", "[!hide][periodically][scheduler][long][perf][sources]"){ GIVEN("schedule_periodically"){ WHEN("the period is 1sec and the initial is 2sec"){ using namespace std::chrono; int c = 0; auto sc = rxsc::make_current_thread(); auto w = sc.create_worker(); auto start = w.now() + seconds(2); auto period = seconds(1); w.schedule_periodically(start, period, [=, &c](rxsc::schedulable scbl){ auto nsDelta = duration_cast(scbl.now() - (start + (period * c))); ++c; std::cout << "schedule_periodically : period " << c << ", " << nsDelta.count() << "ms delta from target time" << std::endl; if (c == 5) {scbl.unsubscribe();} }); } } } SCENARIO("schedule_periodically by duration", "[!hide][periodically][scheduler][long][perf][sources]"){ GIVEN("schedule_periodically_duration"){ WHEN("the period is 1sec and the initial is 2sec"){ using namespace std::chrono; typedef steady_clock clock; int c = 0; auto sc = rxsc::make_current_thread(); auto w = sc.create_worker(); auto schedule_periodically_duration = [w]( rxsc::current_thread::clock_type::duration initial, rxsc::current_thread::clock_type::duration period, rxsc::schedulable activity){ auto periodic = rxsc::make_schedulable( activity, [period, activity](rxsc::schedulable self) { auto start = clock::now(); // any recursion requests will be pushed to the scheduler queue rxsc::recursion r(false); // call action activity(r.get_recurse()); auto finish = clock::now(); // schedule next occurance (if the action took longer than 'period' target will be in the past) self.schedule(period - (finish - start)); }); w.schedule(initial, periodic); }; auto start = w.now() + seconds(2); auto period = seconds(1); schedule_periodically_duration(seconds(2), period, rxsc::make_schedulable(w, [=, &c](rxsc::schedulable scbl){ auto nsDelta = duration_cast(scbl.now() - (start + (period * c))); ++c; std::cout << "schedule_periodically_duration : period " << c << ", " << nsDelta.count() << "ms delta from target time" << std::endl; if (c == 5) {scbl.unsubscribe();} })); } } } SCENARIO("intervals", "[!hide][periodically][interval][scheduler][long][perf][sources]"){ GIVEN("10 intervals of 1 seconds"){ WHEN("the period is 1sec and the initial is 2sec"){ using namespace std::chrono; int c = 0; auto sc = rxsc::make_current_thread(); auto so = rx::synchronize_in_one_worker(sc); auto start = sc.now() + seconds(2); auto period = seconds(1); rx::composite_subscription cs; rx::observable<>::interval(start, period, so) .subscribe( cs, [=, &c](long counter){ auto nsDelta = duration_cast(sc.now() - (start + (period * (counter - 1)))); c = counter - 1; std::cout << "interval : period " << counter << ", " << nsDelta.count() << "ms delta from target time" << std::endl; if (counter == 5) {cs.unsubscribe();} }, [](rxu::error_ptr){abort();}); } } }