使用TThread.Syncronize在线程内创建计时器后,计时器将不起作用

时间:2019-02-08 14:18:23

标签: multithreading delphi timer

我正在尝试使用TThread.Syncronize方法在线程内创建一个计时器,但是它显然不能以这种方式工作。 为了更好地理解,让我向您介绍这种情况: 我的应用程序接收到来自TIdHttpServer的HTTP请求,所以我现在已经在线程中了,对吗? 然后,使用TThread.Syncronize方法使用计时器创建一个对象,并将其存储在主线程中创建的对象列表中。 我不明白为什么计时器不起作用。 参见下面的示例代码来说明问题:

procedure TForm1.Button1Click(Sender: TObject);
begin

  TThread.CreateAnonymousThread(
  procedure
  begin

    TThread.Synchronize(nil,
    procedure
    begin

      FTimer := TTimer.Create(nil);
      FTimer.OnTimer := HandleOnTimer;

    end);

  end);

end;

FTimer在TForm1的私有部分中声明。

1 个答案:

答案 0 :(得分:3)

TThread.CreateAnonymousThread()创建一个线程,但不执行该线程。您需要手动启动创建的线程。

procedure TForm1.Button1Click(Sender: TObject);
begin

  TThread.CreateAnonymousThread(
  procedure
  begin

    TThread.Synchronize(nil,
    procedure
    begin

      FTimer := TTimer.Create(nil);
      FTimer.OnTimer := HandleOnTimer;

    end);

  end).Start();

end;

关于Windows服务内部:

Thread.Synchronize方法在主线程的上下文中执行传递的函数。 Windows Service应用程序中默认没有主线程。

为什么您不简单地在创建的线程中等待请求的时间?

TThread.CreateAnonymousThread(
  procedure
  begin
    TThread.Sleep(1000);
    HandleOnTimer();
  end).Start();

如果您担心同时创建太多线程,请使用一个专用线程根据定时事件队列执行代码。