2010-08-18 4 views
2

J'ai une application Windows multithread où un des threads a une pompe de message dedans. Je dois envoyer un message à ce fil, en lui transmettant des informations. Cependant, l'une des bibliothèques que je veux utiliser dans le thread de travail nécessite std :: string. Puis-je faire quelque chose comme ce qui suit:Puis-je transmettre des structures de données STL à une boucle de message Win32?

typedef struct tagCOMMAND 
{ 
    std::map<std::string, std::string> locator; 
    std::string body; 
} COMMAND, *LPCOMMAND; 

passe ensuite struct au message comme ceci:

LPCOMMAND cmd; 
cmd->body = "Hello"; 
cmd->locator["Hello"] = "World"; 
PostThreadMessage(dwThread, MY_CUSTOM_MESSAGE, NULL, (LPARAM)cmd); 

Si cela est correct, qui est responsable de la libération de la mémoire, le thread appelant ou le travailleur fil?

N.B. Je vais de l'avant avec l'impression que l'utilisation d'une boucle de message Windows est la meilleure et la plus simple, mais je ne suis pas contre l'utilisation d'une bibliothèque Boost si c'est plus approprié. Cependant, il s'agit d'une application spécifique à Windows et qui ne fonctionnera que sous Windows. La compatibilité multiplate-forme n'est donc pas une préoccupation majeure.

Répondre

2

Il est normal et normal de faire passer le pointeur vers des objets en tant que paramètres de message asynchrone, tant qu'il n'y a qu'un seul récepteur (ni plus, ni moins).

Il devrait être de la responsabilité du destinataire de libérer de la mémoire, car l'appelant n'a aucune indication sur la façon de le faire en toute sécurité.

+0

Une autre option, si vous utilisez fréquemment de tels messages, est de garder un pool d'objecs, puis lorsque vous le relâchez, il devrait retourner dans le pool. – Ismael