2014-04-28 1 views
0

J'ai une interface rpc com qui transmet les données d'un service à un client. Du côté client, j'ai besoin de stocker ces données temporairement et de les mettre dans une file d'attente afin qu'elles puissent être traitées plus tard sur le thread ui (ceci doit être fait sur le thread ui car c'est là que les objets à créer).Comment puis-je stocker des données marshalées?

La structure est un peu complexe et contient des pointeurs vers d'autres structures et des chaînes de longueur variable. Question - Y at-il un moyen facile de récupérer le "blob" complet de la mémoire marshalée pour le rangement ou ai-je besoin de dupliquer la même structure et de la remballer moi-même afin de pouvoir la traiter plus tard sur le thread ui? À l'heure actuelle cela ressemble à dupliquer les mêmes struct mais en remplaçant LPCWSTR avec CComBSTR etc etc, qui semble un peu sale et inutile pour moi ...

Merci

Répondre

0

Jusqu'à ce que vous avez besoin de comprendre les données, vous pouvez simplement traiter comme une séquence d'octets. La seule chose que vous devez savoir, c'est combien de données vous avez. Vous pouvez alors faire quelque chose comme:

std::vector<unint8_t> buf; 
buf.resize(length); 
memcpy(&buf[0], source, length); 

puis à un moment plus tard dans le temps, en supposant que votre vecteur est toujours autour

memcpy(dest, &buf[0], buf.size()); 

Le vecteur va se libérer quand il est hors de portée.

La seule chose qui peut être un peu difficile peut-être obtenir la longueur. Cela peut nécessiter une certaine connaissance des données envoyées, mais sinon, il n'est pas nécessaire de décompresser les données.

0

Vous êtes censé rassembler les données entre votre thread d'arrière-plan et votre thread d'interface utilisateur (voir CoMarshalInterThreadInterfaceInStream et CoGetInterfaceAndReleaseStream par exemple). La transmission directe d'un objet COM entre threads est illégale. En utilisant les API mentionnées ci-dessus, vous générez l'objet IStream et placez le pointeur correspondant dans la file d'attente. Ensuite, le thread de l'interface utilisateur récupérait éventuellement le pointeur, appelait la seconde API et récupérait la copie de l'objet.

Tout cela suppose que les données sont dans un objet COM pour commencer. S'il s'agit d'un blob copié sur le réseau par votre objet COM, la sémantique appropriée indique que lorsque vous avez demandé les données de l'objet COM, vous en avez acquis la propriété (et la responsabilité de le libérer/supprimer). Ensuite, il suffit de mettre en file d'attente un pointeur sur les données telles quelles, et de faire en sorte que le thread d'interface fasse la release/delete (Comment? Je ne suis pas sûr, je dois chercher ça peut-être CoTaskMemFree()?)

Si c'est un scénario plus bizarre, s'il vous plaît clarifier ce que c'est.