HOWTO: publier des messages entre les discussions avec Boost :: asio?

Désolé pour mon anglais

J’ai cherché autour, mais je n’ai pas eu de réponse à cette question: J’ai un projet d’application Windows, en utilisant des bibliothèques de thread boost. Je souhaite publier des messages (ou invoquer des rappels) à partir du fil d’un travailleur vers le fil principal de l’interface utilisateur. J’ai étudié les exemples dans boost :: asio, tous utilisés dans un thread principal bloqué, mais mon thread d’interface utilisateur fonctionne de manière asynchrone.

Pourriez vous m’aider s’il vous plait? Merci beaucoup!

Le thread d’interface utilisateur ayant sa propre boucle de message, vous ne pouvez pas appeler dans son contexte la fonction de blocage io_service::run() . Ce que vous pouvez faire est d’entrelacer une méthode d’ io_service::poll_one() liée à l’interface utilisateur avec io_service::poll_one() :

  // WARINING: untested code MSG msg; while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if (io_service_.stopped()) io_service_.reset(); error_code ec; io_service_.poll_one(ec); } 

Désormais, lorsque vous publiez des foncteurs sur io_service_ , vous les publiez réellement dans le fil de l’interface graphique principale.

(Certainement, si vous utilisez un framework d’interface graphique, vous devriez utiliser la méthode de framework appropriée au lieu de PeekMessage .)

Le fil de l’interface utilisateur est-il un type Webkit similaire à l’UI ou aux formulaires Windows, car si vous utilisez Webkit, vous pouvez le gérer de manière différente. OU Essayez d’utiliser des delegates. OU enfin, si rien ne fonctionne, vous pouvez exécuter une boucle while en vérifiant toute nouvelle entrée d’un vecteur et en append au vecteur à partir de la fonction de rappel du fil.

Je préfère si vous pouvez utiliser délégué. (fonction de pointeur)

Voici un exemple de code pour la fonction de pointeur:

définir une fonction comme celle-ci:

 typedef boost::function fnLog; 

ou si vous voulez aller spécifiquement pour Windows puis

 typedef void (__stdcall *fnLog)(char* val); 

fnLog est la fonction avec le paramètre std :: ssortingng. puis liez votre fonction qui est dans le fil de l’interface utilisateur à la fonction de pointeur

 fnLog myPointerFunc = boost::bind( &UI::f1, _1); 

puis passe

myPointerFunc

comme rappel.

pour plus de références sur http://www.radmangames.com/programming/how-to-use-boost-function