Synchronisation de threads (Vista/Win7) [Résolu]

Signaler
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
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

Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
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.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
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.