2009-06-17 5 views
0

この:これはどういう意味ですか?

typedef HRESULT (*PFN_HANDLE)(ClassName&); 

それは次のように使われています:

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

たWaitForMultipleObjectsになったときを待ち、ブロックを除いて何もしないことが表示されますし、その後、この奇妙なpfnh_fooの事をして、周りにループバックのいずれかに再度待機するか終了する

+2

「完了」に割り当てられていませんか? –

+0

doneは本当ですが、これはコードスニップです。 –

+0

pfnh_fooは関数へのポインタです。したがって、Wait関数の行は、渡された関数を呼び出します。 –

答えて

7

wait()は基本的にはwaits for multiple objectsの機能を呼び出してからfunction pointerPFN_HANDLE待機が成功した場合(戻り値WAIT_OBJECT_0で示されます)。

pfnh_foo(*this); 

これは、引数* thisを指定してpfnh_fooが指す関数を呼び出します。

我々は機能を持っているとしましょう:

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

待ちは次のように呼び出されます。

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

someFunctionは関数ポインタなので、PFN_HANDLE pfnh_foo = someFunction;待機(pfnh_foo);または単に待つ(someFunction) –

+0

PFN_HANDLE pfnh_foo =&someFunction; PFN_HANDLE pfnh_foo = someFunction;どちらもうまくいきます:) –

2

pfnh_fooは関数ポインタである - それは、パラメータ

としてあなたのクラスに、機能を実行しています
+0

私は関数を直接呼び出すだけで、引数を完全に待つことができます。右? –

+0

いいえ - Waitの引数は関数ポインタです。 Waitへの引数が常に同じ関数ポインタでない限り、それが必要です。 –

+0

または、次のように言い換えてください:はい、同じパラメータでWaitが常に呼び出された場合は、Waitに引数を削除できます。 Waitの引数は、期待している関数のシグネチャを示しますが、同じシグネチャを持つ複数の関数を持つ可能性があります。 Waitに渡された関数が1つしかないということはありません。 –

2

WAIT_OBJECT_0は、待っている最初のハンドルです。pfnh_fooを実行している場合は、終了した他の待機ハンドルに対して待機しています。

2

それはプロトタイプを持つ関数への関数ポインタを定義しています:それは、その後に渡された機能を取り、パラメータとして現在のオブジェクトを使用して、それを呼び出している

HRESULT someFunction(ClassName &) 

2

pfnh_fooは関数ポインタです。通常の変数のような関数を使うことができます。

HRESULTのFOO(クラス名&)

2

これは、スレッド同期コードである:HRESULT(* PFN_HANDLE)(クラス名&)のtypedef

はPFN_HANDLE署名の関数へのポインタであることを意味します。
は、クラス名のように私には見える:それは競合状態を避けるために使われている
コールバックを呼び出す前に、これは相互である

2

別のスレッドで実行されていると、それは自由だことを知らせるために指定されたオブジェクトのいずれかを待っている待って排除の仕組み、あるいは資源との競争の間に協力する手段...したがって、対象を「待つ」必要性。

編集: ウィキペディアには、相互排除に関する優れたイントロがあり、根本的な問題、アルゴリズム、データ構造に触れています。相互排除の原則を初めてお持ちの方は、読む価値があります。

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

0

だから、僕は関数ポインタを削除することもできますし、その時点で関数を直接呼び出します。Wait()でWaitforMulitpleObjectが返ってきたときに、どのオブジェクトが署名されていても処理する必要のある関数が複数ある場合は、関数ポインタを使用するだけです。

ie。

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

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

はい、正しいです。 –

関連する問題