http://dev.csdn.net/author/firefox1/c57fc75d3dbc46fcb6e3f5ffd0850930.html
一直以来我都认为回调函数就是传一个函数指针给一个函数,在那个特定的函数里面用这个回调函数处理,返回想要的结果给调用的那个函数。像上面那个链接里面的CListCtrl的例子。typedef void(CALLBACK* SORTLISTPROC)(LPARAM dwCtl); //处理插入排序的回调函数,class CSortableListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CSortableListCtrl)public:
CSortableListCtrl();
virtual ~CSortableListCtrl();protected:
DECLARE_MESSAGE_MAP()public:
//在插入数据到列表后立即排序,如果用此方法,在插入数据时必须将该数据插入到第一行
void SortAfterInsert(SORTLISTPROC lpSort, LPARAM dwCtrl); //这里调用回调函数};很多人说回函数是系统调用,不知我理解正确不,我觉得,WindowProc这样的函数是系统调用,你可以修改来响应不同的消息。但上面的例子,我觉得是要自己添加处理的方法的,如在一个响应CListCtrl 的InsertItem或SetItemText消息才在消息响应函数里面调用SortAfterInsert,才有机会调用到那个回调函数,这就是所谓的系统自动调用。 但在这样的情况下,我是可以将这个回调函数的实现写在SortAfterInsert这个类里面的,从面不用上面那个回调函数也可以的。不过对于类型不同的比较,传入不同的指针,在不同的回调函数里面做不同的数据类型转换等,有时候还是很方便的。 不知我上面的理解正不正确??? 欢迎大家指正和发表一下意见。 谢谢
一直以来我都认为回调函数就是传一个函数指针给一个函数,在那个特定的函数里面用这个回调函数处理,返回想要的结果给调用的那个函数。像上面那个链接里面的CListCtrl的例子。typedef void(CALLBACK* SORTLISTPROC)(LPARAM dwCtl); //处理插入排序的回调函数,class CSortableListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CSortableListCtrl)public:
CSortableListCtrl();
virtual ~CSortableListCtrl();protected:
DECLARE_MESSAGE_MAP()public:
//在插入数据到列表后立即排序,如果用此方法,在插入数据时必须将该数据插入到第一行
void SortAfterInsert(SORTLISTPROC lpSort, LPARAM dwCtrl); //这里调用回调函数};很多人说回函数是系统调用,不知我理解正确不,我觉得,WindowProc这样的函数是系统调用,你可以修改来响应不同的消息。但上面的例子,我觉得是要自己添加处理的方法的,如在一个响应CListCtrl 的InsertItem或SetItemText消息才在消息响应函数里面调用SortAfterInsert,才有机会调用到那个回调函数,这就是所谓的系统自动调用。 但在这样的情况下,我是可以将这个回调函数的实现写在SortAfterInsert这个类里面的,从面不用上面那个回调函数也可以的。不过对于类型不同的比较,传入不同的指针,在不同的回调函数里面做不同的数据类型转换等,有时候还是很方便的。 不知我上面的理解正不正确??? 欢迎大家指正和发表一下意见。 谢谢
解决方案 »
- 谁有/哪里有 Visual Assist 6 for VC6 的使用手册 ???
- 如何用ADO实现超大型表的查询???
- 一个关于console的怪问题
- 如何调用动态创建的ActiveX的方法?各位请进别客气!
- 请问如何在win98里作USBKEY的开机认证呢
- 用PQ时,出现one or more lost clusters are present.错误,不能改变大小,如何解决?
- vs2010下使用静态拆分出现错误.急急 在线等.
- vs 窗体程序建立不了
- 请各们介绍一下程序调试常用的方法,或者哪本书有比较详细的介绍谢谢了
- 关于ATL COM DLL注册问题求救
- 怎样往菜单项里动态添加子菜单项。
- stl中hash_map的使用
下面是我在写串口通信时用的回调函数://自定义函数指针,当有数据接收时执行
//data: 指向接收数据的缓冲
//length: 实际接收到数据的长度
typedef void (*PFN)(char* data, int length);
/*
功能:用于与串口通信*/
class CyxComm
{
private:
PFN m_pCallBackFn; //回调函数指针,当接收到数据通知此函数
}//线程函数
UINT threadRecvData(LPVOID pParam)
{
CyxComm* yxComm = (CyxComm*)pParam;
//串口打开?
while (yxComm->isOpenPort())
{
//从串口读数据
int len = sio_read(yxComm->getPort(), yxComm->getRecvBuffer(), MAX_RECV_BUFFER);
//如果有数据
if ( len > 0)
{
//有回回调函数来进行分析接收到的数据
if (yxComm->getFn())
{
char* p = yxComm->getRecvBuffer();
//p: 指向接收数据的缓冲的指针
//len: 实际接收到数据的大小
//把这两个变量通知回调函数
yxComm->getFn()(p, len);
}
}
Sleep(100);
}
return 0;
}回调函数也不一定要让系统来调用的,根据你的需要,具体实现就行了
这些应该都是发生在你自己的程序内的。而windows的窗口过程winproc则有所区别,它是一种异步调用。
你注册上一个回调函数,至于什么时候来调用这个回调函数则由系统来控制的。这种常称为系统调用。
#include<stdio.h>
typedef struct ode
{
int value;
struct Node *link;
}Node;/*Call back function, it's useful for different kind of node, we just want to change compare function*/Node* getnode(Node *ele,void const *val, int (*compare)(void const*, void const *))
{
while(ele!=NULL)
{
if(compare(&(ele->value),val))
break;
ele=ele->link;
}
return ele;
}
int com_int(void const *a,void const *b)
{
if(*(int *)a==*(int *)b)
return 0;
else
return 1;
}
int main()
{
Node root;
Node one;
int target=90;
one.value=90;
one.link=NULL;
root.value=35;
root.link=&one;
Node* tmp=getnode(&root,&target,com_int);
if(tmp!=NULL)
{
printf("%d",tmp->value);
}
return 0;
}//其实回调函数不一定就一定要什么callback之类的才是,很平常的函数也可以是回调函数。 如上面的例子,
//是一个纯C的例子,com_int就是一个回调函数。这里并没有什么系统注册,系统自动调用的。
//这样当然我也可以不用回调函数而实现相关的功能,只要自己实现一个getnode函数,指定具体的类型就行了。
//但是对于不同的类型,你要实现不同的getnode函数;如果用回调的方式,你只要实现不同的回调就行了。
//上面的例子是 C与指针 里面抄下来的。
//但我并不否认像windows里面的LRESULT CALLBACK WindowProc是回调函数,而且是系统自动调用的,只是想让概念更清楚一点。
//不知我上面的想法是不是正确的???
就像这个:LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
//系统定义好了格式之类的,也有做好了关联的,而且是一个virtual函数,你可以改写。
//但在最后调用其基类的WindowProc就行了。即这样:
//return __super::WindowProc(message, wParam, lParam);
这里不知是不是 由系统执行 的意思因为:可以当成一个专有名词“系统调用”
或者是一个主谓句子 “系统 调用”
我语法水平低,别笑回调函数:将函数的地址作为参数传递给其他函数
(一般用于和第三方交互)
这样就有相对性了
我可以定义 一回调函数 传入某 API 或自定义函数,这是通常情况也可以将某 API 函数的地址作为参数 传到我定义的函数
这时这个 API 也叫 回调函数?
一般:
1.回调函数是自定义的,格式根据需要而定2.回调函数是系统调用
(1)回调函数是 API ?
设计操作系统的人真闲阿
(2)回调函数 由系统执行?
那系统有的忙了
哪线程注册这个回调函数,就由它来执行WindowProc 等这些回调函数在系统是不存在的
是要程序员定义的,只不过是一些占位符另外 WindowProc 是由 创建界面的那条线程 来执行的,
而不是什么系统调用,系统自动调用
一般这些 窗体回调函数 ,系统负责消息通知,界面线程执行说不完...
实现都可以,可以是一个c函数指针,一个c++的functor等等。