此:
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;
}
似乎Wait除了阻止它到达WaitForMultipleObjects之外什么都不做,然后在那之后做了这个奇怪的pfnh_foo事情并且循环回来再次等待或退出
答案 0 :(得分:7)
您的wait()
函数基本上是waits for multiple objects,然后如果等待成功,则使用function pointer PFN_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);
答案 1 :(得分:2)
pfnh_foo是一个函数指针 - 它正在运行一个函数,您的类作为参数
答案 2 :(得分:2)
WAIT_OBJECT_0是你正在等待的第一个句柄,如果它执行pfnh_foo,它将退出任何其他等待句柄。
答案 3 :(得分:2)
它使用原型定义了一个函数指针:
HRESULT someFunction(ClassName &)
然后使用传入的函数并使用当前对象作为参数调用它。
答案 4 :(得分:2)
pfnh_foo是一个函数指针。您可以使用普通变量等函数。
typedef HRESULT(* PFN_HANDLE)(ClassName&)表示PFN_HANDLE是指向签名函数的指针:
HRESULT foo(ClassName&)
答案 5 :(得分:2)
这是线程同步代码 看起来像ClassName:Wait在一个单独的线程中运行并等待一个指定的对象在调用回调之前发出信号是免费的 它被用来避免竞争条件
答案 6 :(得分:2)
这是一种相互促进的机制,或者是在竞争资源之间进行合作的手段......因此需要“等待”对象。
编辑: 维基百科有一个很好的互斥介绍,并涉及一些基本问题,算法和数据结构。如果您不熟悉互斥原则,那么值得一读。
答案 7 :(得分:0)
所以我可以删除函数指针并直接在该点调用函数。只有当WaitforMulitpleObject在Wait()中返回时,如果有多个函数需要处理任何对象的函数,那么使用函数指针才有意义。
即
HRESULT Foo(ClassName& myClass);
HRESULT Bar(ClassName& myClass);
anotherFunction(...)
{
Wait(Foo);
Wiat(Bar);
}