96 votes

Qu'est-ce qu'une pompe à message?

Dans ce fil (posté sur un an), il y a une discussion des problèmes qui peuvent venir avec l'exécution de la Parole dans un non-session interactive. Les (très fort) conseils donnés est de ne pas le faire. Dans un post, il est dit "Le Bureau de l'Api de tous supposons que vous exécutez Office dans une session interactive sur un ordinateur de bureau, avec un moniteur, un clavier et une souris et, plus important encore, un message de la pompe." Je ne suis pas sûr de ce qui est. (J'ai été à la programmation en C# pour seulement environ un an; mon autre expérience de la programmation a été principalement avec ColdFusion.)

Mise à jour:

Mon programme fonctionne par le biais d'un grand nombre de fichiers RTF, extrait de deux éléments d'information utilisés pour la construction d'un rapport médical nombre. Plutôt que de chercher à comprendre comment les instructions de mise en forme RTF travail, j'ai décidé de les ouvrir dans Word et tirez le texte à partir de là (sans lancer l'interface graphique). Parfois, le programme hiccuped dans le moyen de traitement d'un fichier, et a laissé un Mot fil ouvert attaché à ce document (je dois encore trouver comment arrêter que l'un vers le bas). Quand j'ai relancé le programme, bien sûr, j'ai reçu une notification qu'il y avait un thread à l'aide de ce fichier, et je ne voulais ouvrir une copie en lecture seule? Quand j'ai dit Oui, le Mot GUI soudain, surgi de nulle part et a commencé à traiter les fichiers. Je me demandais pourquoi cela s'est produit; mais il semble que peut-être une fois la boîte de dialogue surgit le message de la pompe commencé à pousser, l'interface graphique principale de Windows?

Et maintenant, je suis perplexe à propos de quelque chose d'autre. Hier, j'ai posé cette question comme un utilisateur non enregistré - et puis effacé mes cookies de sorte qu'il ne pouvait pas comprendre qui j'étais; maintenant, en tant qu'utilisateur enregistré, j'ai recommencer à partir de zéro :-/ Pourquoi ne pas le rendre plus facile pour vous connecter basés sur les cookies l'enregistrement avec OpenID? Hmf.

174voto

Hans Passant Points 475940

Une boucle de message est un petit morceau de code qui existe dans tout programme Windows natif. Il ressemble plus ou moins à ceci:

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
} 

Le GetMessage() de l'API Win32 récupère un message de Windows. Votre programme, il passe à 99,99% de son temps là, à l'attendre Windows pour dire quelque chose d'intéressant qui s'est passé. TranslateMessage() est une fonction d'assistance qui traduit les messages de clavier. DispatchMessage() s'assure que la procédure de fenêtre est appelée avec le message.

Chaque GUI activé .NET programme a une boucle de message, il est lancé par l'Application.Run().

La pertinence d'une boucle de message d'Office est lié à COM. Les programmes Office sont compatibles COM programmes, c'est la façon dont Microsoft.Bureau de.Interop classes. COM prend soin de filetage pour le compte d'un de COM de la coclasse, il s'assure que les appels effectués sur une interface COM sont toujours fabriqués à partir de le thread approprié. La plupart des classes COM ont une clé de registre dans la base de registre qui déclare leur ThreadingModel, de loin les plus courantes (y compris le Bureau) "Appartement". Ce qui signifie que la seule façon d'appeler une méthode de l'interface est en faisant l'appel à partir de la même thread qui a créé la classe de l'objet. Ou pour le dire d'une autre façon: par jour, la plupart des classes COM ne sont pas thread-safe.

Chaque COM activé thread appartient à un COM appartement. Il en existe deux types, Seul thread Appartements (STA) et un Multi Thread Appartement (MTA). Un appartement filetée COM classe doit être créé sur un thread STA. Vous pouvez le voir dans ce retour dans .NET des programmes, le point d'entrée de la thread de l'INTERFACE utilisateur d'une application Windows Forms ou WPF programme a l'attribut [STAThread]. L'appartement de modèle pour d'autres threads est définie par le Thread.SetApartmentState() la méthode.

De grandes parties de Windows plomberie ne fonctionnera pas correctement si le thread d'INTERFACE utilisateur n'est pas STA. Notamment Glisser+Chute, le presse-papiers, boîtes de dialogue Windows comme OpenFileDialog. Et des contrôles ActiveX et la plupart des serveurs COM, comme Bureau.

Dur, dur d'exigence pour un thread STA est qu'il ne doit pas bloquer et doit pomper une boucle de message. La boucle de message est important parce que c'est ce COM utilise pour ranger un interface de l'appel de méthode à partir d'un thread à l'autre. Bien qu' .NET, le marshaling des appels facile (de Contrôle.BeginInvoke ou Répartiteur.BeginInvoke par exemple), il est effectivement très difficile à faire. Le thread qui exécute l'appel doit être dans un état connu. Vous ne pouvez pas arbitrairement interrompre un thread et le forcer à faire un appel de méthode, qui serait la cause de l'horrible re-entrancy problèmes. Un thread doit être "inactif", pas occupé à exécuter n'importe quel code qui est la mutation de l'état du programme.

Peut-être que vous pouvez voir où cela mène: oui, quand un programme est en exécution de la boucle de message, il est inactif. La réelle regroupement a lieu à travers une fenêtre masquée COM crée, il utilise PostMessage pour avoir la procédure de fenêtre de la fenêtre d'exécuter du code. Sur le thread STA. La boucle de message s'assure que l'exécution de ce code.

11voto

JSBձոգչ Points 25069

Le message "pompe" est une partie essentielle de tout programme Windows qui est responsable de l'envoi de fenêtrage des messages dans les différentes parties de l'application. C'est le cœur de Win32 INTERFACE de programmation. En raison de son ubiquité, de nombreuses applications utilisent la pompe de message à faire passer des messages entre les différents modules, qui est pourquoi les applications Office va casser si elles sont exécutées sans aucune INTERFACE utilisateur.

Wikipedia a une description de base.

6voto

Hogan Points 30189

John est en train de parler sur la façon dont le système de Windows (et d'autres à base de fenêtres, les systèmes X Window, Mac OS d'origine....) mettre en œuvre asynchrone des interfaces utilisateur à l'aide d'événements par l'intermédiaire d'un système de message.

En coulisses, pour chaque application, il existe un système de messagerie où chaque fenêtre peut envoyer des événements à d'autres fenêtres ou des écouteurs d'événement -- ceci est mis en œuvre par l'ajout d'un message à la file d'attente de messages. Il y a une boucle principale qui fonctionne toujours à la recherche à ce message de la file d'attente, puis envoi des messages (ou des événements) pour les auditeurs.

L'article de Wikipedia boucle de Message dans Microsoft Windows montre un exemple de code d'un programme Windows -- et comme vous pouvez le voir au niveau le plus élémentaire d'un programme Windows est juste le "message de la pompe".

Donc, pour tirer tous ensemble. La raison pour laquelle un programme de windows conçue pour supporter une INTERFACE utilisateur ne peut pas agir en tant que service est parce qu'il a besoin de la boucle de message tout le temps pour activer l'INTERFACE utilisateur. Si vous l'appliquer comme un service tel que décrit, il ne sera pas en mesure de processus internes de gestion d'événements asynchrones.

6voto

Dans COM, un message de la pompe serialises et de serialises les messages envoyés entre les appartements. Un appartement est une mini-processus dans lequel les composants COM peut être exécuté. Les appartements sont en mono-thread et libre filetée modes. Seul thread appartements sont essentiellement un système d'héritage pour les applications de composants COM qui ne prennent pas en charge le multi-threading. Ils ont été généralement utilisé avec Visual BASIC (ce qui n'a pas en charge le code multithread) et des applications héritées.

Je suppose que le message de la pompe exigence pour le Mot provient soit de l'API COM ou des parties de la demande n'est pas thread-safe. Gardez à l'esprit que l' .NET threading et la collecte des ordures modèles ne jouent pas bien avec COM hors de la boîte. COM est un très simpliste mécanisme de collecte des déchets et le modèle de threading, qui vous oblige à faire les choses de la COM. En utilisant le standard de Pia d'Office exige toujours explicitement d'arrêter COM les références de l'objet, de sorte que vous besoin de garder une trace de toutes les COM poignée créé. Le Pia permettra également de créer des choses en coulisses si vous ne faites pas attention.

.NET-COM de l'intégration est tout un sujet à lui tout seul, et il y a même des livres écrits sur le sujet. Même en utilisant des Api COM pour le Bureau à partir d'un bureau interactif application vous oblige à sauter à travers des cerceaux et assurez-vous que les références sont explicitement libéré.

Bureau peut être supposé pour être thread-dangereux, de sorte que vous aurez besoin d'un autre instance de Word, Excel ou d'un autre Office applications pour chaque thread. Vous aurait à subir le départ de frais généraux ou de maintenir un pool de threads. Un pool de thread devrait être méticuleusement testés pour s'assurer de toutes les COM références ont été correctement publié. Même le démarrage et l'arrêt de cas exige que vous assurez-vous que toutes les références sont publiées correctement. Défaut de dot votre je et de la croix de votre t ici se traduira par un grand nombre de morts des objets COM et même des instances en cours d'exécution de Word fuite.

2voto

vincebowdren Points 1726

Wikipedia suggère que cela signifie la principale boucle d'événement du programme.

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