Повтор вызова функции с возвращаемым значением c++
Всем привет! У меня есть функции (возможно она принимает параметры) она возвращает значение:
string task()
{
// work here
return something;
}
Есть ли какой то простой способ сделать так, чтобы эта функция вызывалась бесконечное количество раз, с интервалом в 1 секунду (или любым другим chrono интервалом)
Я попробовал сделать это с помощью thread, но треды не возвращают значение. Возможно, можно как то сделать это с помощью async и futures
С теми значениями, которые возвращает функция, я бы хотел работать в главном треде.
UPD добавил псевдокод
string task() {
// do repeatly work
return something;
}
int main() {
int num = 0;
int interval = 100;
bool _execute = true;
std::future<string> result;
// repeatly work with task
// ?????
// I need data from task function in main thread
std::cout << result.get() << std::endl;
return 0;
}
Результаты того, что будет выдавать функция я планирую складывать в ограниченную по размеру(чтобы старые возвращаемые значения функции удалялись) очередь std::deque
UPD:
Еще один псевдокод, здесь с помощью треда можно итерационно вызывать функцию void (обратите внимание, что мне нужно не void а string)
#include <iostream>
#include <functional>
#include <thread>
#include <future>
#include <cpr/cpr.h>
void start(int interval, std::function<void()> func)
{
bool _execute = true;
std::thread([=]() {
while (_execute) {
func();
std::this_thread::sleep_for(std::chrono::seconds(interval));
}
}).join();
}
void task()
{
// some work
}
int main()
{
// all data
std::vector<std::string> data;
// pointer to function
std::function<void()> pToFunc = std::bind(task);
start(1, pToFunc);
return 0;
}
Ответы (1 шт):
с вектором и тредом особенно интересно как это выглядит
Да все просто... Примерно так - мьютекс и вектор, для простоты сделал глобальными
mutex useVector;
vector<string> strs;
Функция, которая строку делает и в вектор запихивает (через мьютекс!)
void doit()
{
// Make String
useVector.lock();
strs.push_back("Hello");
useVector.unlock();
}
Функция, которая отдельным потоком каждую секунду вызывает указанную (именно через sleep_until, чтоб погрешности времени не накапливать)
void DoIt()
{
auto timer{chrono::steady_clock::now()};
for(;;)
{
timer += 1000ms;
this_thread::sleep_until(timer);
// Если вызов быстрый - можно просто выполнять его здесь,
// без отдельного потока. Словом, выбирайте -
thread(doit).detach();
// или
doit();
}
}
Ну, и убедиться, что это работает - опять же через мьютекс вывожу в цикле размер вектора:
int main(int argc, char * argv[])
{
thread(DoIt).detach();
for(;;)
{
this_thread::sleep_for(500ms);
useVector.lock();
cout << strs.size() << endl;
useVector.unlock();
}
}
Это - всего лишь как один из вариантов...