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

如何在Delphi中每隔10秒更新图表的最新价格数据?

实现每10秒自动重复执行代码的方案

方法一:使用TTimer组件(推荐,适用于GUI程序)

这是可视化程序里最稳妥的实现方式,不会阻塞界面操作:

  1. 在窗体上添加一个TTimer组件,设置它的Interval属性为10000(因为单位是毫秒,10秒=10000毫秒)
  2. 将需要重复执行的逻辑移到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:47:32