回调函数问题

yaozhenyu8211 2009-06-30 10:46:57
static INT NewThread(MODULEHANDLE hm, THREADHANDLE& rh, CSTR name, void* (*pfnThread)(void*), void* arg, EPriority pri, DWORD stacksize);

--- -创建一个内存池
----- MODULEHANDLE hm -需要线程的模块的句柄
----- CSTR name -线程的名字
----- pfnThread -线程入口函数
----- arg -线程函数的参数
-----EPriority pri -线程优先级
-----DWORD stacksize -线程堆栈大小
-----return INT -EErrCode
void sJobResetChss(PTResetPara param)
{
........
do something();
}
//创建线程
NewThread(m_hModule, m_hResetThread, "Reset",(void*(*(void*))sJobResetChss, pPara, priNormal,32 * 1024))

请问 为什么要(void *(*(void*))sJobResetChass ?

...全文
38 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaozhenyu8211 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yaozhenyu8211 的回复:]
#include "stdafx.h"
#include "stdio.h"

void sJob(int param)
{
printf("%d",param);
}
static void newThread(void* (*pfnThread)(void*),void* arg)
{
pfnThread(arg);
}
int main(int argc, char* argv[])
{
int h=9;
newThread((void* (*)(void*))sJob,(void*)h);
return 0;
}
[/Quote]

这样 可以编译通过了。打印出9.
yaozhenyu8211 2009-07-01
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "stdio.h"

void sJob(int param)
{
printf("%d",param);
}
static void newThread(void* (*pfnThread)(void*),void* arg)
{
pfnThread(arg);
}
int main(int argc, char* argv[])
{
int h=9;
newThread((void* (*)(void*))sJob,(void*)h);
return 0;
}
yaozhenyu8211 2009-07-01
  • 打赏
  • 举报
回复
但这样转换编译不过去啊
blh 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yaozhenyu8211 的回复:]
typedef void* (*pfnThread)(void*);

(强制转换格式)sJobResetChass==(pfnThread )sJobResetChass.

我的文档里给的强制转换 是(void *(*(void*))  好像少个括号。 具体格式我还是看不明白 。。我郁闷 。。。。。。惭愧
[/Quote]

少了括号就是写错了
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
typedef void* (*pfnThread)(void*);

(强制转换格式)sJobResetChass==(pfnThread )sJobResetChass.

我的文档里给的强制转换 是(void *(*(void*)) 好像少个括号。 具体格式我还是看不明白 。。我郁闷 。。。。。。惭愧
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
我太菜了。。。。。。
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "stdio.h"
void sJob(int param)
{
printf("%d",param);
}
static int newThread(void*(*pfnThread)(void*),void* arg)
{
pfnThread(arg);
}
int main(int argc, char* argv[])
{
newThread((void*(*(void *)))sJob,9);
return 0;
}

我模仿了一下 。。可是编译不过
blh 2009-06-30
  • 打赏
  • 举报
回复
typedef void *(*PfnThread(void*));

(void *(*(void*))sJobResetChass ==> (PfnThread)sJobResetChass

这回明白了吗,如果在不明白,那就去看看什么叫做函数指针
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
(void *(*(void*))sJobResetChass 可是这里的(void *(*(void*))我还是看不明白啊
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复

你意思是如下转换吗?
pfnThread=(void *(*(void*)))sJobResetChass
blh 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yaozhenyu8211 的回复:]
引用 7 楼 blh 的回复:
引用 3 楼 yaozhenyu8211 的回复:
引用 2 楼 blh 的回复:
因为第四个参数要求void* (*pfnThread)(void*)格式的参数,即一个返回值和参数都是void*的函数,而你的sJobResetChss不符合要求,需要强制转换


我知道要强制转换 ,但是不明白为什么这样转 。


不同类型指针转换,不转给C给WARNING,C++给ERROR


我知道肯定要转换的,但是我是不明白 是怎么转换的 ? JobResetChss 返回 void 参数…
[/Quote]

你不是都知道了函数名就是一个函数指针了吗?指针转换,如 int * p = (int*)JobResetChss ;
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 blh 的回复:]
引用 3 楼 yaozhenyu8211 的回复:
引用 2 楼 blh 的回复:
因为第四个参数要求void* (*pfnThread)(void*)格式的参数,即一个返回值和参数都是void*的函数,而你的sJobResetChss不符合要求,需要强制转换


我知道要强制转换 ,但是不明白为什么这样转 。



不同类型指针转换,不转给C给WARNING,C++给ERROR
[/Quote]

我知道肯定要转换的,但是我是不明白 是怎么转换的 ? JobResetChss 返回 void 参数是PTResetPara 类型的。
blh 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yaozhenyu8211 的回复:]
引用 2 楼 blh 的回复:
因为第四个参数要求void* (*pfnThread)(void*)格式的参数,即一个返回值和参数都是void*的函数,而你的sJobResetChss不符合要求,需要强制转换


我知道要强制转换 ,但是不明白为什么这样转 。
[/Quote]

不同类型指针转换,不转给C给WARNING,C++给ERROR
blh 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yaozhenyu8211 的回复:]
函数名  应该可以是函数执行的地址,应该可以看成是一个函数指针的值吗?
[/Quote]

yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
没人来帮忙了?
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
函数名 应该可以是函数执行的地址,应该可以看成是一个函数指针的值吗?
yaozhenyu8211 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 blh 的回复:]
因为第四个参数要求void* (*pfnThread)(void*)格式的参数,即一个返回值和参数都是void*的函数,而你的sJobResetChss不符合要求,需要强制转换
[/Quote]

我知道要强制转换 ,但是不明白为什么这样转 。
blh 2009-06-30
  • 打赏
  • 举报
回复
因为第四个参数要求void* (*pfnThread)(void*)格式的参数,即一个返回值和参数都是void*的函数,而你的sJobResetChss不符合要求,需要强制转换
emyueguang 2009-06-30
  • 打赏
  • 举报
回复
喀~~C++的线程我真的帮不上什么忙了,还有那个回调函数,我最近才算是模模糊糊的知道是什么意思,我知道C#的多线程是怎么实现的,可是帮不了你,支持!

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧