我想在Wait CallFunc()函数中调用Test()方法。
代码:
typedef void (*func)();
void StartTimer(void* pFuncAddr);
void WaitAndCallFunc(void* pPtr);
void WaitAndCallFunc(void* pPtr)
{
int i = 0;
int nWaitTime = 3;
while(1)
{
Sleep(1000);
// I want pPtr to call Test1 Function;
if(i == nWaitTime)
break;
}
_endthread();
}
void StartTimer(void* pFuncAddr)
{
_beginthread(WaitAndCallFunc, 0, pFuncAddr);
}
void Test1();
int main(int argc, char* argv[])
{
StartTimer(Test1);
Sleep(5000);
return 0;
}
void Test1()
{
cout << "Testing Thread\n";
}
答案 0 :(得分:5)
我不确定我明白你的问题是什么,但试试这个:
((func)pPtr)();
答案 1 :(得分:3)
演员和电话:
typedef void (*func)();
void WaitAndCallFunc(void* pPtr)
{
int i = 0;
int nWaitTime = 3;
while(1)
{
Sleep(1000);
func f=(func)pPtr; // cast to correct pointer to function type
f(); // and call!
if(i == nWaitTime)
break;
}
_endthread();
}
答案 2 :(得分:3)
严格来说,你不应该在函数指针和其他类型的指针之间进行转换。它无法保证按预期工作。
因此,一个更迂腐正确的版本看起来像:
struct hook {
void (*func)();
};
void StartTimer(void* pFuncAddr);
void WaitAndCallFunc(void* pPtr);
void WaitAndCallFunc(void* pPtr)
{
struct hook *hook_ptr = pPtr;
hook_ptr->func();
_endthread();
}
void StartTimer(void* pFuncAddr)
{
_beginthread(WaitAndCallFunc, 0, pFuncAddr);
}
void Test1();
int main(int argc, char* argv[])
{
struct hook hook_test1 = { &Test1 };
StartTimer(&hook_test1);
Sleep(5000);
return 0;
}
请注意,在这里,它是与void *进行强制转换的结构指针,而不是函数指针本身。如果你需要将它们传递给Test1(),你还可以在结构中填充更多的值。
答案 3 :(得分:2)
实际上,将函数指针转换为void *或void *转换为函数指针在当前C或C ++中不允许直接 - 即使大多数编译器都编译它。
有两种方法可以在不编译直接转换的编译器上来回转换(使用C语法):
方法1(首先转换为整体中介)
((func) (intptr_t) pPtr)(); // call the void*
StartTimer( (void*) (intptr_t) &Test1); // pass function pointer to void*
方法2(使用void **)
func f = 0;
*((void**)&f) = pPtr;
f();
StartTimer( *((void**) &Test1)); // pass function pointer to void*
您可以参考以下主题获取更多解释:Function pointers casting in C++