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