当我尝试使用Windows SetTimer函数时,它会为计时器生成一个IDEvent,即使是,如果我指定了一个!
此:
SetTimer(0,999,10000,@timerproc);
在:
procedure timerproc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR;dwTime: DWORD); stdcall;
begin
KillTimer(0, idEvent);
showmessage(inttostr(idevent));
end;
返回:
随机数!
是否可以自己管理我的计时器而不是Windows为我选择?
非常感谢!
答案 0 :(得分:8)
如果要在单个例程中处理多个计时器事件,请按特定窗口处理,而不是按特定例程处理:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FTimerWindow: HWND;
procedure TimerProc(var Msg: TMessage);
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
FTimerWindow := Classes.AllocateHWnd(TimerProc);
SetTimer(FTimerWindow, 999, 10000, nil);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Classes.DeallocateHWnd(FTimerWindow);
end;
procedure TForm1.TimerProc(var Msg: TMessage);
begin
if Msg.Msg = WM_TIMER then
with TWMTimer(Msg) do
case TimerID of
999:
//
else:
//
end;
end;
答案 1 :(得分:5)
SetTimer将以不同的方式工作,具体取决于您是否向其传递窗口句柄。
Timer_Indentifier := SetTimer(0, MyIdentifier, Time, @myproc);
在上面的例子中,Timer_Identifier不等于MyIdentifier。
Timer_Indentifier := SetTimer(handle, MyIdentifier, Time, @myproc);
在第二个例子中,Timer_Identifier = MyIdentifier。
这是因为在第二个示例中,您的Windows循环将需要使用“MyIdentifier”来找出哪个计时器正在向其发送“WM_Timer”消息。
使用没有窗口句柄的特定计时器功能是不同的。简短的回答是,在您的方案中,使用Windows为您提供的值。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644906%28v=vs.85%29.aspx
答案 2 :(得分:0)
多媒体计时器解决了我的问题!
我可以通过dwUser
传递任何我想要的东西:)
MMRESULT timeSetEvent(
UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
DWORD_PTR dwUser,
UINT fuEvent
);
来自MSDN:dwUser - >用户提供的回调数据。
TIME_ONESHOT
选项,这正是我用的计时器!