2009-06-17 10 views
0

Ce:Qu'est-ce que cela signifie?

typedef HRESULT (*PFN_HANDLE)(ClassName&); 

Il est utilisé comme ceci:

DWORD ClassName::Wait(PFN_HANDLE pfnh_foo) 
{ 
    while (!done) { 
    waitCode = WaitForMultipleObjects(paramA, paramB, paramC, paramD) 

    if (waitCode == WAIT_OBJECT_0) 
    { 
     pfnh_foo(*this); 
    } 
    else 
     done; 
    } 
    return waitCode; 
} 

Il semble que Wait ne fait rien, sauf le bloc quand il arrive à WaitForMultipleObjects puis après qui fait cette chose étrange pfnh_foo et soit reboucle autour attendre de nouveau ou quitte

+2

aucune affectation à 'fait'? –

+0

fait serait vrai, mais c'est un code snip. –

+0

pfnh_foo est un pointeur sur une fonction - la ligne de la fonction Wait appelle donc la fonction qui lui est transmise. –

Répondre

7

Votre wait() fonction fondamentalement waits for multiple objects, puis appelez la fonction en utilisant function pointerPFN_HANDLE si l'attente est réussie (indiquée par la valeur de retour WAIT_OBJECT_0).

pfnh_foo(*this); 

Ceci appelle la fonction pointée par pfnh_foo avec argument * this.

Disons que nous avons la fonction:

HRESULT someFunction(ClassName& myClassInstance) 
{ 
//blah .. blah 
} 

Wait sera appelé comme ceci:

PFN_HANDLE pfnh_foo = &someFunction; //function pointer to someFunction 
wait(pfnh_foo); 
+0

someFunction est le pointeur de fonction, donc PFN_HANDLE pfnh_foo = someFunction; wait (pfnh_foo); ou attendez (someFunction) –

+0

PFN_HANDLE pfnh_foo = & someFunction; PFN_HANDLE pfnh_foo = someFonction; Les deux sont bien :) –

2

pfnh_foo est un pointeur de fonction - il est en cours d'exécution d'une fonction, avec votre classe en tant que paramètre

+0

Donc, je pourrais simplement appeler la fonction directement et supprimer l'argument d'attendre tout à fait. Droite? –

+0

Non - l'argument de Wait est un pointeur de fonction. À moins que l'argument d'attendre soit toujours le même pointeur de fonction, vous en avez besoin. –

+0

Ou pour reformuler cela: oui, vous pouvez supprimer l'argument de Wait si Wait est toujours appelé avec le même paramètre. L'argument de Wait vous indique la signature de la fonction attendue, mais vous pouvez avoir plusieurs fonctions avec la même signature. Il n'est pas acquis qu'il n'y ait qu'une seule fonction qui soit passée à Wait. –

2

WAIT_OBJECT_0 est le premier handle que vous attendez, s'il exécute pfnh_foo, pour tout autre gestionnaire d'attente qu'il quitte.

2

C'est la définition d'un pointeur de fonction à une fonction avec le prototype:

HRESULT someFunction(ClassName &) 

Il prend alors la fonction qui est passé et appelant à l'aide de l'objet courant comme paramètre.

2

pfnh_foo est un pointeur de fonction. Vous pouvez utiliser des fonctions comme des variables normales.

typedef HRESULT (* PFN_HANDLE) (NomClasse &) signifie que PFN_HANDLE est un pointeur vers une fonction de signature:

HRESULT foo (NomClasse &)

2

Ceci est le code de synchronisation de fil.
Me semble ClassName: Attendez est en cours d'exécution dans un thread séparé et d'attendre l'un des objets spécifiés pour signaler qu'il est gratuit avant d'appeler la fonction de rappel
Il est utilisé pour éviter une condition de course

2

C'est une mutuelle mécanisme d'exlcusion, ou un moyen de coopérer entre concurrents pour les ressources ... d'où la nécessité d '«attendre» les objets.

modifier: Wikipédia a une bonne intro sur l'exclusion mutuelle et aborde quelques problèmes fondamentaux, algorithmes et structures de données. Si vous êtes nouveau aux principes d'exclusion mutuelle, cela vaut la peine d'être lu.

http://en.wikipedia.org/wiki/Mutual_exclusion

0

donc je pourrais simplement supprimer le pointeur de fonction et appeler la fonction directement à ce moment-là.Cela n'aurait de sens que d'utiliser un pointeur de fonction s'il y avait plus d'une fonction qui aurait besoin de gérer n'importe quel objet signifié lorsque le WaitforMulitpleObject retourne dans Wait().

ie.

HRESULT Foo(ClassName& myClass); 
HRESULT Bar(ClassName& myClass); 

anotherFunction(...) 
{ 
    Wait(Foo); 
    Wiat(Bar); 
} 
+0

Oui, c'est correct. –