114 votes

Obtenir l'état d'un std::future

Est-il possible de vérifier si un std::future a terminé ou non ? Pour autant que je sache, la seule façon de le faire serait d'appeler wait_for avec une durée de zéro et vérifier si l'état est ready ou pas, mais y a-t-il un meilleur moyen ?

111voto

Jonathan Wakely Points 45593

Vous avez raison, et à part le fait d'appeler wait_until avec un temps dans le passé (ce qui est équivalent), il n'y a pas de meilleur moyen.

Vous pouvez toujours écrire un petit wrapper si vous souhaitez une syntaxe plus pratique :

template<typename R>
  bool is_ready(std::future<R> const& f)
  { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }

N.B. : si la fonction est différée, ceci ne retournera jamais vrai, donc il est probablement mieux de vérifier wait_for directement dans le cas où vous souhaitez exécuter la tâche différée de manière synchrone après un certain temps ou lorsque la charge du système est faible.

19voto

Rick Yorgason Points 788

Il y a une fonction membre is_ready en cours de réalisation pour std::future. En attendant, l'implémentation VC possède un membre _Is_ready().

13voto

Mon premier pari serait de suivre wait_for avec une durée de 0, et vérifiez le code de résultat qui peut être l'un des suivants future_status::ready , future_status::deferred o future_status::timeout .

valid() retournera true si *this fait référence à un état partagé, indépendamment du fait que cet état soit prêt ou non. Voir Référence cpp .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X