要让这个计时器在 Delphi Alexandria 64位下工作需要做哪些修改?

ux6nzvsh  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(129)

冲突发生在回调中的“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;
o7jaxewo

o7jaxewo1#

指针在32位内部版本中是32位值,在64位内部版本中是64位值。但是,无论内部版本类型如何,您都将Self指针作为32位值传递,因此它在64位内部版本中被截断。
您需要根据documentation修复MMTimerCallBack()的声明和对TimeSetEvent()的调用,以便在两种构建类型中正确传递指针,例如:

procedure MMTimerCallBack(TimerID, Msg: UINT; dwUser, dw1, dw2: DWORD_PTR); stdcall;
begin
  ...
end;

procedure TSVATimerThread.Execute;
begin
  ...
  FTimerID := TimeSetEvent(..., @MMTimerCallBack, DWORD_PTR(Self), ...);
  ...
end;

相关问题