Je cherche une solution pour que ma boucle principale accède à une pile de messages (std::stack<Ogre::String> dernier entré premier sorti).
Les messages lus sont supprimés de la pile ( logique c'est une pile ).
J'ai un client ( boost::asio::ip::tcp ) qui récupère les messages du serveur de manière asynchrone et les ajoutes à la piles.
Je voudrais mettre cette pile de messages dans un mutex.
Je souhaite utiliser boost::mutex.
Est ce faisable même si je n'utilise pas boost::thread pour ma main loop ( boucle de rendu d'Ogre. )
Si oui comment le feriez vous, c'est la première fois que je fais joujou avec les mutex et j'ai un peu de mal à concevoir la chose pour le moment.
Voici quelques liens :
http://matthieu-brucher.developpez.c...st/thread/#LII
http://stackoverflow.com/questions/1...king-the-mutex
[EDIT]
Voici mon idée :
Headers:
Sources :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class MessagesStack : public Ogre::Singleton<Ca::Network::Tcp::MessagesStack> { public: typedef std::stack<Ogre::String> Messages ; /** Renvoi la copie de m_Messages et efface m_Messages */ Ca::Network::Tcp::MessagesStack::Messages GetMessages() ; /** Ajoute en bas de la pile un nouveau message */ void PushMessage( const Ogre::String &inMessage ) ; MessagesStack() ; ~MessagesStack() ; static Ca::Network::Tcp::MessagesStack& getSingleton() ; static Ca::Network::Tcp::MessagesStack* getSingletonPtr() ; private: Ca::Network::Tcp::MessagesStack::Messages m_Messages ; boost::recursive_mutex m_Mutex ; };
EDIT:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 template<> Ca::Network::Tcp::MessagesStack* Ogre::Singleton<Ca::Network::Tcp::MessagesStack>::ms_Singleton = NULL ; ////////////////////////////// /* MessagesStack */ ////////////////////////////// Ca::Network::Tcp::MessagesStack::MessagesStack() {} Ca::Network::Tcp::MessagesStack::~MessagesStack() {} Ca::Network::Tcp::MessagesStack& Ca::Network::Tcp::MessagesStack::getSingleton() { boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ; M_ASSERT_NULL( ms_Singleton, "Ca::Network::Tcp::MessagesStack& Ca::Network::Tcp::MessagesStack::getSingleton()" ) return ( *ms_Singleton ) ; } Ca::Network::Tcp::MessagesStack* Ca::Network::Tcp::MessagesStack::getSingletonPtr() { boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ; return ms_Singleton ; } Ca::Network::Tcp::MessagesStack::Messages GetMessages() { boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ; Ca::Network::Tcp::MessagesStack aMessages = m_Messages ; m_Messages = Ca::Network::Tcp::MessagesStack::Messages() ; return aMessages ; } void Ca::Network::Tcp::MessagesStack::PushMessage( const Ogre::String &inMessage ) { boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ; m_Messages.push( inMessage ) }
Bon ça pas l'air d'être la logique. Je pense que je vais mettre m_Mutex en static et laisser les fonctions appelantes enrober l'appel d'un boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ;
Dans getSingletonPtr() et getSingleton()
error: invalid use of member 'Ca::Network::Tcp::MessagesStack::m_Mutex' in static member function
Partager