当前位置:  开发笔记 > 程序员 > 正文

常规过程/方法指针

如何解决《常规过程/方法指针》经验,为你挑选了1个好方法。

如何定义timeSetEvent作为实例方法的回调函数?

TUDPBC = class(TObject)                                         
private
  hTimer: word;
...
public
  procedure sendUDPBC;
...
end;

procedure DoTimer(uTimerID, uMessage: UINT; dwUser,dw1,dw2: DWORD); stdcall;

procedure TUDPBC.sendUDPBC;  //send UDP Broadcast
begin
...
  hTimer := TimeSetEvent(FTimeOut, uRes, DoTimer, 0, TIME_ONESHOT); //need DoTimer as a TUDPBC class method
...
end;

David Heffer.. 6

如何定义timeSetEvent作为实例方法的回调函数?

简单的答案是你做不到.回调的签名不是你可以改变的.它由API定义,并且必须是具有此签名的简单非绑定过程:

typedef void ( CALLBACK *LPTIMECALLBACK)(
   UINT      uTimerID,
   UINT      uMsg,
   DWORD_PTR dwUser,
   DWORD_PTR dw1,
   DWORD_PTR dw2
);

你可以做的是传递一个timeSetEvent包含你的实例地址的指针.模式运行如下:

procedure TimeProcCallback(uTimerID, uMessage: UINT; dwUser,dw1,dw2: DWORD_PTR); stdcall;
begin
  TUDPBC(dwUser).TimeProc(uTimerID, uMessage);
end;

这是您传递给的回调timeSetEvent.你的课将如下所示:

type
  TUDPBC = class
  private
    FTimerID: MMRESULT;
    procedure TimeProc(uTimerID, uMessage: UINT);
  end;

该类的方法将由回调函数调用,因此可以访问实例变量.

像这样设置计时器:

FTimerID := timeSetEvent(TimeOut, uRes, TimeProcCallback, DWORD_PTR(Self), TIME_ONESHOT);

因此,您在dwUser参数中传递实例的地址.然后将其传递给您的回调.反过来,该回调可以调用实例方法.



1> David Heffer..:

如何定义timeSetEvent作为实例方法的回调函数?

简单的答案是你做不到.回调的签名不是你可以改变的.它由API定义,并且必须是具有此签名的简单非绑定过程:

typedef void ( CALLBACK *LPTIMECALLBACK)(
   UINT      uTimerID,
   UINT      uMsg,
   DWORD_PTR dwUser,
   DWORD_PTR dw1,
   DWORD_PTR dw2
);

你可以做的是传递一个timeSetEvent包含你的实例地址的指针.模式运行如下:

procedure TimeProcCallback(uTimerID, uMessage: UINT; dwUser,dw1,dw2: DWORD_PTR); stdcall;
begin
  TUDPBC(dwUser).TimeProc(uTimerID, uMessage);
end;

这是您传递给的回调timeSetEvent.你的课将如下所示:

type
  TUDPBC = class
  private
    FTimerID: MMRESULT;
    procedure TimeProc(uTimerID, uMessage: UINT);
  end;

该类的方法将由回调函数调用,因此可以访问实例变量.

像这样设置计时器:

FTimerID := timeSetEvent(TimeOut, uRes, TimeProcCallback, DWORD_PTR(Self), TIME_ONESHOT);

因此,您在dwUser参数中传递实例的地址.然后将其传递给您的回调.反过来,该回调可以调用实例方法.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有