2009-06-17 19 views
0

:Was bedeutet das? Diese

typedef HRESULT (*PFN_HANDLE)(ClassName&); 

Es ist wie folgt verwendet:

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; 
} 

Es scheint, dass Warten tut nichts, außer Block, wenn es um WaitForMultipleObjects bekommt und dann danach tut diese seltsame pfnh_foo Sache und entweder eine Schleife zurück um wieder warten oder verlässt

+2

keine Zuordnung zu 'done'? –

+0

getan wäre wahr, aber das ist ein Code-Snip. –

+0

pfnh_foo ist ein Zeiger auf eine Funktion - so ruft die Zeile in der Wait-Funktion jede Funktion auf, die an sie übergeben wird. –

Antwort

7

Ihre wait() Funktion grundsätzlich waits for multiple objects und dann aufrufen Funktion function pointerPFN_HANDLE wenn die Wartezeit erfolgreich ist (angezeigt durch Rückgabewert WAIT_OBJECT_0).

pfnh_foo(*this); 

Dies ruft die von pfnh_foo angegebene Funktion mit Argument * this auf.

Können sagen, wir haben Funktion:

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

Warten wird wie folgt aufgerufen werden:

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

someFunction ist der Funktionszeiger, also PFN_HANDLE pfnh_foo = someFunction; warte (pfnh_foo); oder einfach warten (someFunction) –

+0

PFN_HANDLE pfnh_foo = & someFunction; PFN_HANDLE pfnh_foo = someFunction; Beide sind in Ordnung :) –

2

pfnh_foo ist ein Funktionszeiger - es ist eine Funktion, mit der Klasse als Parameter

läuft
+0

So könnte ich nur die Funktion direkt aufrufen und entfernen Sie das Argument zu warten insgesamt. Recht? –

+0

Nein - das Argument für Wait ist ein Funktionszeiger. Wenn das Argument für Wait nicht immer der gleiche Funktionszeiger ist, brauchen Sie es. –

+0

Oder neu zu formulieren: ja, Sie könnten das Argument zu Wait entfernen, wenn Wait immer mit dem gleichen Parameter aufgerufen wird. Das Argument für Wait teilt Ihnen die Signatur der Funktion mit, die es erwartet, aber Sie könnten mehrere Funktionen mit der gleichen Signatur haben. Es ist nicht selbstverständlich, dass nur eine Funktion an Wait übergeben wurde. –

2

WAIT_OBJECT_0 ist das erste Handle, auf das Sie warten, wenn es pfnh_foo ausführt, wird es für jedes andere Wait-Handle beendet.

2

Es ist die Definition einer Funktion Zeiger auf eine Funktion mit dem Prototyp:

HRESULT someFunction(ClassName &) 

Es ist dann die Funktion nehmen, die sie übergeben wird in und ruft das aktuelle Objekt als Parameter.

2

pfnh_foo ist ein Funktionszeiger. Sie können Funktionen wie normale Variablen verwenden.

typedef HRESULT (* PFN_HANDLE) (Classname &) bedeutet, dass PFN_HANDLE ein Zeiger auf eine Funktion der Signatur ist:

HRESULT foo (Classname &)

2

Dies ist Thread-Synchronisationscode.
Sieht mir wie Classname: Warten Sie in einem separaten Thread ausgeführt wird, und wartet auf eine der angegebenen Objekte zu signalisieren, dass es den Rückruf vor dem Aufruf
kostenlos ist eine Race Condition

2

Dies ist eine gegenseitige wird es benutzt, um zu vermeiden, Exclusion-Mechanismus, oder ein Mittel zur Zusammenarbeit zwischen konkurrierenden Ressourcen ... also die Notwendigkeit, auf die Objekte zu warten.

bearbeiten: Wikipedia hat ein gutes Intro zum gegenseitigen Ausschluss und berührt einige grundlegende Probleme, Algorithmen und Datenstrukturen. Wenn Sie mit den Prinzipien des gegenseitigen Ausschlusses noch nicht vertraut sind, sollten Sie es lesen.

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

0

So konnte ich nur die Funktionszeiger entfernen und die Funktion direkt an dieser Stelle nennen.Es würde nur Sinn machen, einen Funktionszeiger zu verwenden, wenn mehr als eine Funktion vorhanden wäre, die jedes Objekt, das signiert wird, wenn das WaitforMulitpleObject in Wait() zurückkehrt, verarbeiten müsste.

dh.

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

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

Ja, das ist richtig. –