Эту задачу можно попробовать решить с помощью реактивного программирования, асинхронно обрабатывая поступающие данные (метод on_next).
А также обрабатывая случаи завершения (on_completed) и возникновения ошибки (on_error)
в входной последовательности.
Для C++ есть библиотека rxcpp.
Псевдокод:
auto srcValuesThread = rxcpp::observe_on_new_thread();
auto uiThread = rxcpp::observe_on_new_thread();
auto period = std::chrono::milliseconds(1);
auto values = rxcpp::observable<>::interval(period);
values
// отфильтровать только четные значения
.filter([](int i){ return i % 2 == 0})
// обработать только 3 значения
.take(3)
// преобразование какждое значение
.map([](int i){ return i * 100});
// продолжить обработку на потоке uiThread
.observeOn(uiThread)
// выполнить подписку и запустить генерацию значений на потоке srcValuesThread
.subscribe_on(srcValuesThread)
.subscribe(
// on_next
[this](int v){ this->labelWidget.setText("OnNext:");}
// on_error
[this](std::eception_ptr eptr){ this->labelWidget.setText("OnError"); },
// on_completed
[this](){ this->labelWidget.setText("OnCompleted");});
А также обрабатывая случаи завершения (on_completed) и возникновения ошибки (on_error)
в входной последовательности.
Для C++ есть библиотека rxcpp.
Псевдокод: