如何让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
相关产品推荐
相关产品推荐

