C++ std::async exécuter sur le thread principal
EST-il un moyen de l'exécution d'une fonction de retour sur le thread principal ?
Donc, si j'ai appelé une fonction Asynchrone via du téléchargement d'un fichier et ensuite analysé les données. Il serait alors une fonction de rappel qui irait sur mon principal thread d'INTERFACE utilisateur et de mettre à jour l'INTERFACE utilisateur ?
Je sais que les threads sont égaux à la valeur par défaut implémentation C++ donc je dois créer un pointeur partagé à mon thread principal. Comment pourrais-je faire cela et de passer de la fonction Async non seulement le pointeur partagé pour le thread principal, mais aussi un pointeur vers la fonction que je veux rrun sur elle et ensuite l'exécuter sur ce thread principal ?
std::async
, vous avez besoin de sondage pour la préparation de la valeur du fil qui vous intéresse (ou à partir d'un autre thread et le message du thread d'INTERFACE utilisateur). Bien sûr, vous pourriez vous enveloppez-le véritable fonction dans une autre fonction qui envoie le message pour vous...Vous pouvez utiliser
get()
pour synchroniser avec un fil.Serait signaux de travailler avec cela ?
En général, vous ne pouvez pas exécuter une fonction sur un autre thread. Si que l'autre thread de l'exécuter? La grande exception est l'exécution d'une fonction sur un nouveau fil de discussion, ou d'un fil dans un pool de threads. Ils sont, par définition, pas de suite quelque chose d'autre, afin qu'ils puissent exécuter votre fonction à droite maintenant.
Serait d'avoir la mainthread sondage de l'avenir être une solution viable, si j'avais une minuterie sur le thread principal qui appelle une fonction qui vérifie si une action avait été fait, puis appelle la fonction de rappel avec les contrats à terme de résultat, cela fonctionnerait-il ?
OriginalL'auteur James Campbell | 2013-06-27
Vous devez vous connecter pour publier un commentaire.
J'ai lu C++ Simultanéité dans l'Action et le chapitre quatre (AKA "Le Chapitre je Viens de terminer") décrit une solution.
La Version Courte
Ont partagé
std::deque<std::packaged_task<void()>>
(ou une sorte de message/tâche de la file d'attente). Votrestd::async
-lancé fonctions peuvent pousser les tâches de la file d'attente, et votre thread GUI peut les traiter au cours de sa boucle.Il n'est pas Vraiment une Version Longue, mais Voici un Exemple
De Données Partagée
La
std::async
FonctionLe Thread GUI
Remarques:
Je suis (toujours) l'apprentissage, donc il ya une bonne chance que mon code n'est pas grande. Le concept est au moins de son bien.
Le destructeur de la valeur de retour de
std::async
(unstd::future<>
) bloque jusqu'à ce que l'opération lancée avecstd::async
complète (voirstd::async
), donc en attente sur le résultat d'une tâche (comme je le fais dans mon exemple) dansone_off
peut-être pas une idée brillante.Vous souhaitez peut-être (je voudrais, au moins) créez votre propre thread-safe MessageQueue type d'améliorer la lisibilité du code/maintenabilité/bla bla bla.
Je vous jure, il y a une chose que je voulais faire remarquer, mais il m'échappe en ce moment.
Exemple Complet
Dat De Sortie
OriginalL'auteur tecu
Vous êtes à la recherche pour
std::launch::deferred
? Passer ce paramètre à std::async rend la tâche exécutée sur le thread appelant lorsque le get() est appelé pour la première fois.OriginalL'auteur Jagannath