我正在尝试使用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的私有部分中声明。
答案 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();
如果您担心同时创建太多线程,请使用一个专用线程根据定时事件队列执行代码。