如何将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;
最佳答案
How can I define callback function of
timeSetEvent
as an instance method?
简单的答案是你不能。您无法更改回调的签名。它由 API 定义,并且必须是 simple unbound procedure with this signature :
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 参数中传递实例的地址。然后将其传递给您的回调。该回调可以依次调用实例方法。
关于delphi - 常规过程/方法指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34220201/