如何在Delphi中每隔10秒更新图表的最新价格数据?
实现每10秒自动重复执行代码的方案
方法一:使用TTimer组件(推荐,适用于GUI程序)
这是可视化程序里最稳妥的实现方式,不会阻塞界面操作:
- 在窗体上添加一个
TTimer组件,设置它的Interval属性为10000(因为单位是毫秒,10秒=10000毫秒) - 将需要重复执行的逻辑移到Timer的
OnTimer事件中,代码修改如下:
// 定时器触发事件,每10秒执行一次 procedure Timer1Timer(Sender: TObject); var path : string ; Sellected : string; begin path := 'C:\Users\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Files\'; Sellected := ' .txt'; chart(path + 'XAUUSD M1' + Sellected); ChartReplace(path + 'XAUUSD M1' + Sellected); end; // 按钮点击仅负责启动定时器 procedure Button1Click(Sender: TObject); begin Timer1.Enabled := True; // 开启定时器,自动按设定间隔执行逻辑 end;
注意:原代码里的Pause(10)要去掉,它会阻塞界面线程导致程序假死,定时器本身就会按间隔触发执行,不需要额外暂停。
方法二:循环+Sleep(适用于控制台程序,GUI程序不推荐)
如果是控制台环境或者可以接受界面暂时无响应,也可以用无限循环配合Sleep实现:
procedure Button1Click(Sender: TObject); var path : string ; Sellected : string; FStopLoop: Boolean; // 用于手动终止循环的变量 begin path := 'C:\Users\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Files\'; Sellected := ' .txt'; FStopLoop := False; // 无限循环,直到手动触发停止 while not FStopLoop do begin chart(path + 'XAUUSD M1' + Sellected); ChartReplace(path + 'XAUUSD M1' + Sellected); Sleep(10000); // 等待10秒,单位为毫秒 // 若为GUI程序,必须加这行代码处理界面消息,避免程序假死 // Application.ProcessMessages; end; end;
补充说明
- GUI程序优先选TTimer方案,能保证界面正常响应用户操作
- 用循环方案时,建议额外加一个“停止”按钮,点击时设置
FStopLoop := True来终止循环
内容的提问来源于stack exchange,提问作者Ebrahim
相关产品推荐
相关产品推荐

