Synchronisation de threads (Vista/Win7)

Résolu
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 24 févr. 2011 à 11:08
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 25 févr. 2011 à 04:14
Salut, j'ai un problème pour synchroniser 2 threads, je pense que la solution est du coté de WaitForSingleObject ou de SleepConditionVariableCS mais je ne sais pas comment utiliser ces fonctions pour remplacer proprement ma vilaine boucle while et le Sleep.

#define TIMEOUT 5000

class Game: public IAsync
{

private :

volatile BOOL m_bRunning;
Engine* m_pEngine;

public :

Game( );
~Game( );

BOOL Run( );
VOID Invoke( IResult* pResult ); // IAsync methode.
};

BOOL Game::Run( )
{
m_pEngine->Run( ); // Methode asynchrone qui va appeler la methode Invoke.

// Ici je voudrais attendre le passage de m_bRunning à TRUE.

DWORD dwTime = timeGetTime( );
while( ( timeGetTime( ) - dwTime ) < TIMEOUT )
{
if ( m_bRunning )
{
break;
}

Sleep( 0 ); // !!!
}

return m_bRunning;
}

VOID Game::Invoke( IResult* pResult )
{
// ...

m_bRunning = TRUE;
}

3 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
24 févr. 2011 à 11:51
Salut,

Tu peux utiliser un "event" en lieu et place du flag m_bRunning.

Tu ajoutes le membre suivant dans ta classe :
HANDLE m_event ;


Dans le constructeur, tu initialises l'"event" :
m_event = CreateEvent( 0 , FALSE , FALSE , 0 ) ;


Dans la méthode Run() tu attends que l'"event" soit levé :
WaitForSingleObject( m_event , INFINITE ) ;


Et à la fin de la méthode Invoke(), tu lèves l'"event", ce qui débloqueras le WaitForSingleObject() :
SetEvent( m_event ) ;


Cordialement.
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
24 févr. 2011 à 11:42
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
25 févr. 2011 à 04:14
Merci c'est très clair, je ne sais pas pourquoi je pensais que les "wait handles" étaient associés à un delegate, un pointeur de fonction mais non pas du tout et donc ça fonctionne parfaitement dans mon cas.
0
Rejoignez-nous