如何定义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
参数中传递实例的地址.然后将其传递给您的回调.反过来,该回调可以调用实例方法.
如何定义
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
参数中传递实例的地址.然后将其传递给您的回调.反过来,该回调可以调用实例方法.