IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Message Queue loop et exécutable console


Sujet :

Windows

  1. #1
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut Message Queue loop et exécutable console
    Je connais bien la programmation graphique et les files de messages sous Unix mais trés peu sous Windows.

    Voilà mon problème j'essaye de gérer la file de messages Windows mais depuis une application Console ... ?

    Autrement dit j'ai besoin d'avoir une boucle GetMessage TranslateMessage DispatchMessage mais pour un exécutable sans fenêtres ... Comment faire ?

    Je pensais écrire la fonction WinMain faisant ça, mais juste avant lancer un autre thread sur l'ancien main() de mon programme console ...

    Bref je suis un peu paumé.
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ben... Pas besoin de faire grand-chose de particulier: Tu écris ta boucle de message et tu l'exécutes, que ce soit dans une application console ou dite "graphique"...

    Par contre, il faut qu'il y ait des messages à recevoir, ou ton application console sera bloquée sur le GetMessage(). Il ne faut pas oublier que la console elle-même n'envoie pas de messages à l'application.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Merci.

    Entre temps j'avais déjà écris la boucle en question, seulement effectivement la fonction WinMain reste bloquée sur GetMessage.

    En théorie elle devrait recevoir des message car le thread que j'ai crée juste avant recoit des events DDE via une fonction de callback. En tout cas c'est ce qui est dit dans la documentation :

    Citation Envoyé par doc
    Because DDE is a message-based protocol, it employs no special Win32 functions or libraries. All DDE transactions are conducted by passing certain defined DDE messages between the client and server windows.
    ...
    An application callsSendMessage to issue the WM_DDE_INITIATE message or a WM_DDE_ACK message sent in response to WM_DDE_INITIATE. All other messages are sent byPostMessage.
    Comprends pas là où j'ai fait erreur.
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans tous les cas, il faut qu'il y ait une fenêtre pour recevoir le message.
    Et évidemment, elle doit être dans un thread qui a une boucle de messages.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Non je ne crois pas, et ce pour 3 raisons :

    - ça doit tout de même être possible de créer une application console qui reçoit des data notify update DDE ?

    - en version console "pure" (sans boucle GetMessage) je reçoit bien l'évènement mais cependant juste avant la fin du programme. Donc preuve comme quoi même sans fenêtre les events arrivent bien sur la fonction de callback

    - DDE fait partie des mécanismes IPC, et donc de communication "Inter Processus" et pas "Inter Windows", donc normalement pas besoin de créer de Window pour bénéficier du DDE
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème, c'est que contrairement à PostMessage()/PostThreadMessage(), la fonction SendMessage() semble nécessiter une fenêtre comme destinataire, et non "juste la file de messages d'un thread".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    En fait je devrais reformuler autrement ma question :

    - est-ce qu'une application Win32 purement console possède une file de message par défaut ?

    Car c'est vraiment là le problème. J'ai vraiment l'impression que la version console de mon exe n'a pas de file du tout, puisqu'elle flush tous les messages en fin de d'éxécution et non pas dès qu'ils arrivent.

    Sinon, pour la version GUI de l'exe, avoir ma boucle bloquée sur GetMessage() dans le thread principal, à priori ça ne me gêne pas plus que cela ; du moment que mon second thread reçoit bien les biens les events DDE.

    Je viens de penser à quelque chose, peut être qu'inverse les 2 threads pourra résoudre mon pb. Je vais essayer.

    Sinon faire un PeekMessage() à la place du GetMessage() ça va améliorer les choses ?
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Que ce soit sur une application console ou dite "graphique", tout thread possède une file de messages après avoir appelé une fonction liée à celle-ci (PeekMessage(), GetMessage(), etc).

    Si tu as peur que la file de message soit créée trop tard, tu peux toujours rajouter un appel à PeekMessage() avec les flags PM_NOREMOVE|PM_NOYIELD au début de ton main...

    Mais le problème que je vois pour les événements DDE, c'est surtout pour les messages qui sont plus destinés à une fenêtre qu'à un thread (notamment tous ceux envoyés avec SendMessage()).

    N'oublies pas qu'à partir de Win2000, on peut créer des "Message-only windows", qui sont des fenêtres non-visibles "légères" destinées uniquement à recevoir et traiter les messages...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Oui j'avais aussi pensé aux applications GUI WindowLess mais je voulais éviter à tout prix, car je me sens pas assez à l'aise pour gérer le pbs. de la WindowMain surtout si ma librairie est utilisée avec des EDI comme MSVCPP & .NET forms ou BCPPB.

    Je crois que DDEML va vraiment me mener la vie dure, mais j'ai réussi quand même à avancer un peu.

    Un simple GetMsg / TranslateMsg / DispatchMsg à interval régulier semble bien transmettre les messages de la file Windows vers les files & callbacks DDE et ce même en exe pur console.

    Il faut dire que j'avais en plus un bug dans l'initialisation du protocole DDE entre le client console et le serveur.

    Par contre passer en multi-threading, ça va pas être de la tarte, parce que là j'aurais plusieurs files d'attentes, et faire un message loop dans un thread ça ne va transferer, dans l'autre thread, les messages entre la file et le callback.

    Donc j'ai bien peur d'être à nouveau bloqué.
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

Discussions similaires

  1. Portage de la message queue POSIX sous WINCE
    Par tonio35 dans le forum Windows
    Réponses: 2
    Dernier message: 14/02/2007, 14h51
  2. afficher un message sans empêcher l'exécution
    Par n_moalla dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/11/2006, 21h11
  3. Les messages queues et l'embarqué
    Par fveysseire dans le forum C
    Réponses: 2
    Dernier message: 29/05/2006, 13h43
  4. [MySQL] Message d'erreur à l'exécution d'une requête
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/02/2006, 14h06
  5. Message d'erreur à l'exécution d'une install
    Par titof dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 22/03/2005, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo