Метод wait_for
Метод wait_for класса future ожидает,
пока связанная с объектом future асинхронная
операция завершится, но не дольше указанного промежутка
времени. В первый параметр мы передаем длительность
ожидания в виде объекта std::chrono::duration,
а во второй - необязательный предикат, который проверяется
перед возвратом. Метод возвращает одно из значений
перечисления std::future_status:
"ready", если результат готов,
"timeout", если время ожидания истекло,
или "deferred", если операция отложена.
Если у объекта future нет связанного общего
состояния, поведение метода не определено. Для проверки
наличия состояния перед вызовом используйте метод
valid.
Синтаксис
future.wait_for(timeout);
future.wait_for(timeout, pred);
Пример
Давайте создадим асинхронную задачу с помощью
std::async и подождем ее завершения
100 миллисекунд:
#include <iostream>
#include <future>
#include <chrono>
using namespace std;
int main()
{
auto fut = async(launch::async, [] {
this_thread::sleep_for(chrono::milliseconds(50));
return 42;
});
auto status = fut.wait_for(chrono::milliseconds(100));
if (status == future_status::ready) {
cout << "ready" << endl;
cout << fut.get() << endl;
} else {
cout << "not ready" << endl;
}
return 0;
}
Результат выполнения кода:
"ready"
42
Пример
Давайте уменьшим время ожидания до 10
миллисекунд, тогда задача не успеет завершиться
и метод вернет статус "timeout":
#include <iostream>
#include <future>
#include <chrono>
using namespace std;
int main()
{
auto fut = async(launch::async, [] {
this_thread::sleep_for(chrono::milliseconds(50));
return 42;
});
auto status = fut.wait_for(chrono::milliseconds(10));
if (status == future_status::ready) {
cout << "ready" << endl;
cout << fut.get() << endl;
} else if (status == future_status::timeout) {
cout << "timeout" << endl;
}
return 0;
}
Результат выполнения кода:
"timeout"