Я создал этот код C ++ 17, который имитирует то, что мне нужно.
std::cout << "start" << std::endl;
auto a = std::async([]() -> int {
std::this_thread::sleep_for(std::chrono::seconds{ 5 });
return 2;
});
std::cout << a.get() << std::endl;
std::cout << "stop" << std::endl;
Поток спит здесь, но в реальном примере я выполняю тяжелые операции и возвращаю целое число, которое может быть 0, 1 или 7. Это мой вывод:
start
2
stop
Это хорошо! Этот код не замораживает мой пользовательский интерфейс. Я знаю, что a.get()
является блокирующей операцией, но есть ли способ не блокировать?
Другими словами: вместо
start
2
stop
можно получить как вывод
start
stop
2
с использованием async
? Мне нужна асинхронность, потому что я нашел в сети, что это полезно, когда необходимо вернуть значение. Это также легко читать! Я не хочу использовать std::packaged_task
, обещания, фьючерсы и т. Д., Потому что async
легко.
Если это не может быть неблокирующим, могу ли я использовать что-то еще?