2009-01-16 6 views
5

ma question est: comment puis-je utiliser SendMessage() pour implémenter la communication de thread entre deux threads, l'un avec une fenêtre (GUI) et l'autre sans fenêtre?Communication de thread en utilisant SendMessage

Le problème est que SendMessage() a besoin d'un handle (HWND)?

Un autre détail au sujet de mon projet: Deux fils, un fonctionnement du code managé (celui avec l'interface utilisateur), et l'autre en cours d'exécution du code natif (l'une sans fenêtre)

Merci beaucoup!

+0

SendMessage est une fonction extrêmement dangereuse à utiliser dans un environnement multi-thread, car il est thread-safe et ne peut conduire à des impasses (je parle de expérience). –

Répondre

3

Peut-être que vous devriez essayer d'utiliser PostMessage ou PostThreadMessage

+0

J'aime beaucoup PostThreadMessage. Existe-t-il une version bloquante de cette fonction? Car PostThreadMessage renvoie sans attendre que l'appelé traite le message. –

+0

Non. Il ne serait pas trop compliqué d'implémenter une version bloquante - utilisez PostThreadMessage, et puis ayez le bloc thread appelant sur un événement que l'appelé définira lorsqu'il aura traité le message –

2

Si le thread n'a pas de fenêtre, pas de file d'attente de messages, et aucun répartiteur de message, alors il va être difficile à un message à lui. Il est courant que les threads créent des fenêtres cachées uniquement à des fins de communication (jetez un oeil avec Windows Spy et vous verrez beaucoup d'exemples).

Une alternative consiste à utiliser une mémoire partagée et une primitive de synchronisation telle qu'un événement ou un sémaphore. Une autre alternative est d'utiliser des tuyaux.

2

ce que dit @jdigital. Notez que si vous créez une fenêtre cachée, et que votre thread n'implémente pas déjà une boucle de message (soit en langage win32 standard, soit dans le contexte d'une COM STA) et si vous n'avez aucune idée de ce dont je parle alors il n'y en a probablement pas dans votre thread), vous aurez aussi besoin de créer une boucle de message. ATL le rend assez facile avec _AtlModule.RunMessageLoop(); Malheureusement, cela signifie également que le thread en question aura probablement besoin d'être piloté par les événements alors qu'il se trouve dans la boucle de message. Vous pouvez faire des choses difficiles comme MsgWaitForMultipleObjects, mais il devient poilu.

Voici un exemple de hidden windows si vous êtes familier avec ATL/COM. Je suis passé par cette douleur tout à l'heure et j'ai pensé qu'il y avait une discussion utile sur microsoft.public.vc.atl, mais le meilleur que je peux trouver maintenant est this post. ce qui va dans certains détails sur les variantes de boucles de message (quoi faire différemment si vous avez des raccourcis clavier ou des fenêtres non modales, des sons comme vous ne le faites pas dans votre application).

Questions connexes