CALLBACK 函数的用处

LastOne 2000-03-11 11:17:00
我的理解比较模糊,大致如下:

CALLBACK函数是一个Target的消息处理循环中枢, 所有当前对象(Form,Dlg..)的消息
被接受后, 转由它来分类响应.

这种理解对吗?


问题:

1. callback 函数有什么有别于普通函数的特性? 请说的详细些.

2. 如果我的理解基本正确, 那在SDK中除了WinPro = /*CALLBACK*/ MyPro用得到它以外, 还能
在哪用的到它?

3. callback 是否能起到类似:

for (;;)
{
if (SomeThing) continue;
}

的作用? 就是说在某一地段进入循环, 避免程序结束. 或者是程序继续向下运行,
但是它却一直等待某个条件的满足以便做自己的事, 程序和它互不干扰, 就像抛出
了一根独立线程一样?

请高手解惑.
...全文
1058 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Schubert 2000-03-13
  • 打赏
  • 举报
回复
任务之间的通信方式由多种,如信号量/灯,端口,消息队列等。其中最常用的一种就是消息队列。但当两个任务之间的接口需要灵活时,特别是一个较通用的任务,其大用户任务要和她通信,为了让大家用起来方便,可由使用者编写回调函数,回调函数的编写很灵活,可根据用户的需要,或发消息,或做其他处理,完全由编写者来定。使用者只要将这个函数的指针传给目标任务,由她来调用回调函数,做你想做的事情就是了。

如果你是一个RTOS程序员,这个问题很容易理解.
Schubert 2000-03-13
  • 打赏
  • 举报
回复
任务之间的通信方式由多种,如信号量/灯,端口,消息队列等。其中最常用的一种就是消息队列。但当两个任务之间的接口需要灵活时,特别是一个较通用的任务,其大用户任务要和她通信,为了让大家用起来方便,可由使用者编写回调函数,回调函数的编写很灵活,可根据用户的需要,或发消息,或做其他处理,完全由编写者来定。使用者只要将这个函数的指针传给目标任务,由她来调用回调函数,做你想做的事情就是了。

如果你是一个RTOS程序员,这个问题很容易理解.
deerlxy 2000-03-13
  • 打赏
  • 举报
回复
这个问题也曾困扰了我一段时间。
从概念上讲,回调函数与普通函数的本质区别在于:调用者的不同。普通函数由程序员代码调用,而回调函数由操作系统在适当的时间调用。
回调函数主要用于处各种事件和处理。由于WINDOWS系统中存在大量程序员事先不可知的事件,例如鼠标的单击,程序员事先无法得知终端用户何时会发出此动作,因此只能:
A。定义事件的处理逻辑,与普通函数的编程一样;
B。告之操作系统自己的处理逻辑,即通知操作系统函数指针;VC/VB等现代编程语言通过事件编程机制隐藏了这一步;
C。操作系统在事件出现时,调用指定的函数(回调函数的概念)处理,这一步完全由系统负责。
回调函数在各种操作系统中普遍存在,是现代操作系统为程序员提供处理异步事件的基本机制之一,在不同的系统中的具体实现方式各不相同;请参阅随机文档。
kxy 2000-03-12
  • 打赏
  • 举报
回复
CALLBACK就是函数指针的运用,没有别的什么.
如WndProc, 注册窗口时,要有它,就是把WndProc的函数指针传过去,在消息循环中
可以调用它,SetWindowLong可以改变WndProc就是把函数指针该成你写的函数
已答问题中有CALLBACK的讨论
E 2000-03-12
  • 打赏
  • 举报
回复
大家不要吵,容小弟也来说说自己的一孔之见:

其实CALLBACK函数一点也不神秘!他不过是一个普通函数而已!

有些中文参考书上把CALLBACK函数称为“回调函数”,表示WINDOWS调用的
位于用户进程空间中的函数,因此其调用约定必须与WINDOWS API调用约定
一致,即为WINAPI,也即_stdcall.象WndProc,Enum***Proc
(EnumThreadProc,EnumProcessProc,EnumWindowsProc...)等都是CALLBACK
函数。

为了让WINDOWS调用你的CALLBACK函数,你必须把你的函数指针传给他:
WndProc要在RegisterClass(&WndClass) 的 WndClass 中指定;
EnumWindowProc 要在
EnumWindows( WNDENUMPROC lpEnumFunc, // EnumWindowProc的指针
LPARAM lParam //程序员指定的值,用来区分不同的
//EnumWindows调用
)
的lpEnumFunc中指定。

Windows 会在适当的时侯调用你的CALLBACK函数,如WndProc在窗口有消息
时被调用,EnumWindowProc在WINDOWS找到窗口时被调用。

CALLBACK函数并不象第3点说的那样象一个线程,就拿EnumWindowProc来说
吧:EnumWindows 要在EnumWindowProc 返回FALSE或所有窗口都被列举时才
返回,例如有以下代码:
BOOL EnumwndProc(HWND hwnd,LPARAM lparam)
{
//Do something with the window hwnd
return TRUE;
}
void func()
{
int i;
EnumWindows(EnumwndProc,0);
i++;
}

func 中的 i++ 在所有窗口都被列举前将不被执行。
bluewind 2000-03-12
  • 打赏
  • 举报
回复
在VC中,有
#define CALLBACK _stdcall
#define WINAPI _stdcall
有:
WINAPI 与 CALLBACK 一样
kxy 2000-03-12
  • 打赏
  • 举报
回复
:)对,不错,我吃错了药,哈哈
lu0 2000-03-12
  • 打赏
  • 举报
回复
to all:
:)这种问题一笑了之,没必要如此争论.:)
GoldenLion 2000-03-12
  • 打赏
  • 举报
回复
CALLBACK是Windows用来回调的函数说明,类型为函数指针。
kxy 2000-03-12
  • 打赏
  • 举报
回复
发消息还不是用回调函数的方法
wzq 2000-03-12
  • 打赏
  • 举报
回复
你想象一下你若编写一通讯动态库,这一动态库若接收到数据,准备往主程序传送这些数据,如果不用发消息的方法,怎么实现?可以用回调函数的方法。

kxy 2000-03-12
  • 打赏
  • 举报
回复
to lu0, CALLBACK就是函数指针,如果你知道函数指针概念的话,我的回答就不会
觉得古怪.
lu0 2000-03-12
  • 打赏
  • 举报
回复
这个问题问得蹊跷,回答也都很古怪.:D 分数70分看来也古怪.:)
CALLBACK就是CALLBACK.就是OS或其他一些功能组件会调用的函数,根据不同的
情况,调用者和调用约定都会有所不同.没有必要死记CALLBACK的概念.:)
例如各种HOOK的CALLBACK调用约定都不同.窗口函数也是CALLBACK函数.
当然,你的主程序也可以调用CALLBACK.这里说的调用约定不是说STDCALL或者
FASTCALL之类的调用约定.而是值调用的参数数量,参数解释访问的调用约定.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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