You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让TTimerThread调用工作线程方法?线程安全定时器疑问

线程安全定时器替换与类整合问题

我了解到在工作线程中创建和使用Vcl.TTimer并非线程安全,目前我的工作线程使用Vcl.TTimer大部分时候能正常运行,但希望替换为基于事件的TTimerThread类。不过我不清楚该如何整合这两个类,让TTimerThread能够访问工作线程的方法。

当事件触发(间隔3000ms)时会调用ExecuteTimed()方法,以下是伪代码:

uses TimerThread;

type
  TMyTimerThread = class( TTimerThread )
  protected
    procedure ExecuteTimed; override;
[...] 

TMQTTClient = class(TThread)
private
  [...] 
  fKeepAliveTimer:TTimer;                     // 能用但不安全
  fKeepAliveTimerThread:TMyTimerThread;       // 待使用的定时器线程
  [...] 

procedure TMyTimerThread.ExecuteTimed;
begin
  beep;   // 这部分能正常运行
end;

[...] 

constructor TMQTTClient.Create(aHostname: string; aPort: integer; ClientID:String;aKeepAliveSeconds : word);
begin
  // 初始化一些内容...
  fKeepAliveTimer:=TTimer.Create(nil); // 不安全的实现
  fKeepAliveTimer.Interval:=fKeepAliveSeconds * 1000;
  fKeepAliveTimer.OnTimer:=DoKeepAlive; // 每隔指定时间调用的方法指针,能运行但非线程安全

  fKeepAliveTimerThread:=TMyTimerThread.Create();
  fKeepAliveTimerThread.Interval:=3000;
  //fKeepAliveTimerThread.ExecuteTimed := ?; // 这里想给MyTimerThread的ExecuteTimed方法赋值指针
end;

我曾设想在ExecuteTimed()中使用TThread.Synchronize()来调用工作线程实例的DoKeepAlive方法(如frmMain.myMqttWorkerClass.DoKeepAlive),但不确定这是否是正确的实现方式。

内容的提问来源于stack exchange,提问作者Sascha Ott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:56:14