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:
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 ;
            };
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
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 )
 
}
EDIT:

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