2011-10-24 5 views
0

J'ai une application C++ qui a la structure suivante:C++ Multithreading et événements

classe AAA: a quelques fonctions et un d'entre eux la fonction qui ouvre un fil. Classe BBB: a quelques fonctions et l'une d'elles fonctionne qui ouvre un fil. Classe CCC: appelle AAA et BBB qui à l'intérieur de leurs fonctions ouvrent les bandes de roulement. Dans certains cas, je sais quelque chose que je veux quitter la bande de roulement et notifier à la fois BBB et CCC. parce que je suis dans un thread (Win32Thread) c'est une fonction vide que je cours dans le thread, donc je ne peux pas retourner une valeur à CCC.

Je suis nouveau en C++ (venant de la zone C#) et je ne sais pas comment le faire. (la notification) note: je ne peux pas changer cette structure. Je peux seulement ajouter ou faire des changements mineurs dans la fonction des classes. c'est un gros processus qui s'exécute dans les bandes de roulement et le gros code.

Une idée? pas un sale s'il vous plaît, si possible :)

l'ajout d'un échantillon m'aidera beaucoup.

Répondre

0

Je ne comprends pas trop votre problème, c'est un peu trop générique. Et vous n'avez pas spécifié le type de bibliothèques multithread que vous utilisez.

Pour envoyer des messages entre les threads, les files d'attente de messages sont généralement utilisées, avec des handles d'attente, des verrous et des sémaphores pour les synchroniser.

Bien sûr, vous avez besoin d'une file d'attente multithread sûre pour envoyer vos messages entre les threads.

Une solution possible:

Si le thread A besoin d'envoyer un message à fil B par enqueueing dans la file d'attente fil B, en se réveillant vers le haut si elle est en état de repos par un événement d'attente par exemple. Le thread B reçoit le message et répond en postant un autre message dans la file d'attente.

Une autre solution possible:

Discussion besoin d'envoyer un message à fil B et ont besoin d'une réponse, le blocage de fil A jusqu'à ce que la réponse ne soit pas reçu. Thread Une mise en file d'attente d'un message dans la file d'attente de thread B, l'objet de message peut être dans la pile de fonctions. Ensuite, il réveille le thread B s'il est à l'état inactif et entre ensuite dans un état d'attente via une poignée d'attente ou un sémaphore par exemple. Thread B, lors de la suppression du message, écrivez la réponse dans l'objet envoyé par le thread A et réveille le thread A de son état en attente. Le champ d'objet doit être marqué comme volatil car il est accédé en lecture/écriture par deux threads. Ensuite, le thread A utilise la valeur stockée dans l'objet message et supprime l'objet de la pile.

Semble compliqué écrit en mots mais l'implémentation est assez simple.

Si vous êtes sous Windows OS, vous pouvez simplement utiliser la file d'attente des messages Windows en créant des fenêtres de message invisibles, une pour chaque thread. Utilisez PostMessage pour le premier cas, SendMessage pour le second cas.

0

Si vous n'avez pas peur d'une solution spécifique à Windows: appelez le PeekMessage() à partir du fil BBB. Cela va créer une file d'attente de messages Windows pour cela. (Le fil principal en a déjà un).Maintenant, vous pouvez utiliser SendMessage() pour envoyer un message de AAA aux autres discussions. Notez que vous envoyez des threads, pas des classes. Tout appel à GetMessage() verra vos messages.

0

La conception type que j'utilise pour les threads est une fonction de thread qui est passée à une instance de la classe qui la contient (qui contient également les variables d'instance pour ce thread). Est-ce le cas pour vous? Est-ce que le thread a une instance d'une classe qui lui est passée? si c'est le cas, gardez juste la trace de ceux de l'extérieur et mettez les propriétés BOOL qui indiquent quand arrêter. Dans les boucles principales des threads, vous vérifiez simplement le drapeau pour voir si vous avez des affaires en boucle à nouveau. C'est le seul moyen de quitter un thread.