J'utilise de multithreading dans ma demande avec _breginthread et dès maintenant pour attendre que tous les threads soient effectués, j'ai des bools globaux qui sont définis sur TRUE, car chaque thread se termine donc dans une boucle de temps jusqu'à présent. Il doit y avoir une façon plus propre de faire cela? P>
merci p>
6 Réponses :
Ce que vous voulez jeter un coup d'œil aux techniques de synchronisation des threads - Heureusement, il y a beaucoup d'informations sur MSDN qui peuvent probablement vous aider. Il est probable que vous voudrez utiliser des événements et des gauchons ici est la principale chose sur MSDN: http://msdn.microsoft.com/en-us/library/ms681924%28v=vs.85%29.aspx Il existe un certain nombre d'exemples. P>
Il existe également des informations sur la synchronisation dans le MFC (qui peut être utile ou non utile, ajoutée à des fins de référence): http://msdn.microsoft.com/en-us/library/975t8ks0%28vs.71%29.aspx P>
J'ai fait un peu de recherche, mais j'ai eu du mal à essayer de suivre certaines informations utiles pour vous, ce qui n'utilise pas la mise en œuvre MFC. Il y a un bon tutoriel ici ( http://www.informit.com/ Bibliothèque / content.aspx? B = VISAL_C_PLUSPLUS & SEQNUM = 149 ) Mais, à nouveau, en utilisant MFC. Vous pourriez jeter un coup d'œil à la mise en œuvre de MFC de mutexs comme un début. P>
Donc, vous devez vous familiariser avec les fonctions et les structures de synchronisation - Tout couvert sur MSDN: http://msdn.microsoft.com/en-us/library/ms686679%28v=VS.85%29.aspx P>
Vous devez certainement utiliser des événements sur les bools.
Vous pouvez utiliser waitformultiPleObjects attendre pour les fils finis dans le fil primaire. P>
Si vous n'avez qu'un identifiant de thread, vous devrez d'abord la convertir en une poignée en appelant Opthread .
Non, n'appelle pas Opthread! Si le fil déjà sorti et l'ID a été réaffecté, vous pouvez vous retrouver avec une poignée à un fil aléatoire différent. Utilisez _breginthreadex, qui retourne une poignée au fil. (_BeginThread renvoie également une poignée, mais (citant les docs) qu'il "pourrait être invalide ou pointe vers un autre fil". N'utilisez jamais _breginthread.)
Utilisez La poignée de thread peut être utilisée avec l'une des fonctions de synchronisation de Win32, telles que waitforsingleObject ou WaitformultipleObjects . P>
Une fois terminé, les poignées renvoyées par _breginthreadex code> à la place. _breginthread code> et _breginthreadex code> Renvoie une poignée de thread , mais le thread a commencé avec _breginthread code> ferme automatiquement sa poignée lors de la fin, l'utiliser pour la synchronisation n'est pas fiable. P>
_breginthreadex code> doivent être fermées avec CLOSEHANDLE () CODE>. P>
Windows fournit des événements pour un thread pour en informer un autre. Sur la case Visual C ++ fournit une prise en charge des événements uniquement à l'intérieur de la MFC. Pour une version portable, non-MFC, cochez la case Classes de gestion de la bibliothèque de boost. Ils font du lancement et de l'attente des threads beaucoup plus facilement, bien qu'ils ne donnent pas accès direct à toutes les fonctionnalités de Windows API. P>
La méthode habituelle consiste à conserver toutes les poignées de thread, puis à attendre sur chaque poignée. Lorsque la poignée est signalée em>, le thread est terminé de sorte qu'il soit retiré de l'ensemble des filets. J'utilise Les premiers sons inefficaces, mais il est en fait la plus directe et la moindre erreur des deux. Si vous devez attendre tous les threads, utilisez la boucle suivante: p> à l'aide de Ce n'est pas vraiment joli mais cela devrait fonctionner. Si vous faites confiance à ce que tous vos threads quitteront et ne vous dérangez pas les attendre, vous pouvez utiliser Bien sûr, l'autre option consiste à trouver une implémentation de pool de threads et à l'utiliser à la place. L'écriture du code de filetage n'est pas vraiment très amusante surtout une fois que vous devez le soutenir à l'état sauvage. Envisagez d'utiliser quelque chose comme std :: Set
waitforsingleObject code> avec un délai d'attente sur chacun li>
waitformultiPleObjects code> li>
ol> waitformultipleobjects code> pour attendre que les fils finissent peu plus difficile que cela semble. Ce qui suit attendra tous les threads; Cependant, il n'attend que wait_maxim_objects code> threads à la fois. Une autre option est de boucler sur chaque page de threads. Je laisserai cet exercice au lecteur;) p> WaitformultiPleObjects (ARY.SIZE () et ARY [0], VRAI, INFINITE) CODE>. Cela n'est généralement pas très sûr car un thread en fuite fera que votre application bloque indéfiniment et em> il ne fonctionnera que si ary.size () code> est inférieur à celui de Maximum_wait_Objects code>. P> boost :: thread_group code> à la place. em> p> p> p>
Vous pouvez utiliser Boost :: Objets de thread. Appelez rejoindre code> sur l'objet et il attendra que le fil finisse. P>