回调函数究竟有什么使用价值,有否例子,效率如何?

135 2000-02-24 06:08:00
...全文
372 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Firing_Sky 2000-02-24
  • 打赏
  • 举报
回复
回调函数是window编程的基础,感觉其精华就是用函数地址作为参数来调用,顺手帖出一段示例代码

type
TCallBackFunction = function(s: string): integer;
CallMe(s: string): integer;



procedure TestCallBack(CallBackFunction: TCallBackFunction); far; external 'Other';
{ Note that 'other' is a Dll containing the procedure TestCallBack }

function CallMe(s: PChar): integer;
begin
{ what ever you need to do }
CallMe := 1; { What ever you need to return }
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TestCallBack(CallMe);
end;

type
TMainFunction = function(s: string): integer;
TestCallBack(MainFunc: TMainFunction);
{ in library Other implementation }
TestCallBack(MainFunc: TMainFunction);
var
result: integer;
begin
result:=MainFunc('test');
end;
netmare 2000-02-24
  • 打赏
  • 举报
回复
如同mutant所说,回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,毁掉函数提供了一种异步的机制,相对于同步执行,提高了效率.前者的例子如WriteFileEx,ReadFileEx等,函数的最后一个参数是一个会掉函数的指针,程序中调用WriteFileEx以后,就直接返回了,可以继续进行其他工作,系统在读写操作完成后通知程序作善后处理.后者的例子就是windows的事件机制
回调函数的另一个用途,是用于一些枚举函数,如EnumDisplayModes等,每找到一种支持的显示模式,就通知回调函数,由回调函数具体处理,这是因为EnumDisplayModes本身并不知道用户要如何处理.
使用回调函数可以提供这样一种机制:系统定义了一个框架,但不确定这个框架的具体功能,用户提供回调函数,定制系统的功能,这样,不同的用户提供不同的回调函数,可以使系统具有不同的功能.这就是所谓的plugin.
dengdun 2000-02-24
  • 打赏
  • 举报
回复
回调函数就是在程序中由你所写的一段函数代码,但是却由Windows系统来调用,你自己悠远也不能调用。
回调函数都是外部公共函数或类的静态成员函数,其函数内部所使用的变量也必须是公共变量或内的成员变量。
Lin 2000-02-24
  • 打赏
  • 举报
回复
按我的理解,回调函数就是...钩子函数,当系统准备作某项工作时,就会自动调用。一般用在枚举系统资源等场合,如窗口、任务、字体等。
下面的例子用来枚举字体:

function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
FontType: Integer; Data: Pointer): Integer; stdcall;
begin
with TStrings(Data) do
if ((Count = 0) or (Indexof(LogFont.lfFaceName) = -1)) then
if Pos('@', LogFont.lfFaceName) = 0 then
AddObject(LogFont.lfFaceName, TObject(FontType = TRUETYPE_FONTTYPE));
Result := 1;
end;

procedure TFontComboBox.GetInstalledFonts;
var DC: HDC;
LFont: TLogFont;
begin
Items.Clear;
Zeromemory(@LFont, SizeOf(TLogFont));
LFont.lfCharset := DEFAULT_CHARSET;
DC := GetDC(0);
try
EnumFontFamiliesEx(DC, LFont, @EnumFontsProc, LongInt(Items), 0);
finally
ReleaseDC(0, DC);
end;
ItemIndex := 0;
end;

这是我做的字体组合列表框代码的一部分,可用。
mutant 2000-02-24
  • 打赏
  • 举报
回复
水平有限,不知道对不对。
回调函数是异步返回的,满足某种条件后系统将调用此函数,以便于程序进行处理。
其实有点类似于消息,但是比消息好用,因为消息可能被中途截获或篡改,而回调函数没办法截获,比较安全。
同时,消息一旦多了之后,时序很容易发生问题,用回调函数要好一些
xubin_sh 2000-02-24
  • 打赏
  • 举报
回复
让系统可以调用你的函数
sess 2000-02-24
  • 打赏
  • 举报
回复
同意以上虾的观点,可以参考《windows 深入编程》讲得很详细
kxy 2000-02-24
  • 打赏
  • 举报
回复
回调函数是window事件驱动机制的基础:)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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