冲突发生在回调中的“Suspended”行。计时器组件是SVATimer.pas,我使用了多年,结果良好、准确。它仍然在Rio下运行,但不在Alexandria下运行。
procedure MMTimerCallBack(TimerID, Msg: Uint; dwUser, dw1, dw2: DWORD); stdcall;
begin
with TSVATimerThread(dwUser) do
if Suspended then begin
TimeKillEvent(FTimerID);
FTimerID:= 0
end
else
Synchronize(FOwner.DoTimerProc)
end;
procedure TSVATimerThread.Execute;
begin
repeat
FTimerID:= TimeSetEvent(FInterval, 0, @MMTimerCallBack, cardinal(Self), TIME_PERIODIC);
if FTimerID <> 0 then
WaitForSingleObject(FEvent, INFINITE);
if FTimerID <> 0 then
TimeKillEvent(FTimerID)
until Terminated
end;
1条答案
按热度按时间o7jaxewo1#
指针在32位内部版本中是32位值,在64位内部版本中是64位值。但是,无论内部版本类型如何,您都将
Self
指针作为32位值传递,因此它在64位内部版本中被截断。您需要根据documentation修复
MMTimerCallBack()
的声明和对TimeSetEvent()
的调用,以便在两种构建类型中正确传递指针,例如: