为什么TTimer不能正常工作?

时间:2010-09-20 10:01:40

标签: delphi timer delphi-2010

正如您所知,我使用Delphi 2010开发的应用程序中的TTimer VCL组件有点麻烦。

每当我打电话:

Self.Timer1.Enabled := False;
Self.Timer1.Enabled := True;

计时器组件似乎确实停止了,但是,它永远不会再次启动。就像,它从不调用OnTimer事件。

我将它与Indy10 IRC组件(TIdIRC)结合使用。

提前致谢:)

4 个答案:

答案 0 :(得分:6)

你也知道大多数Indy的电话都在封锁吗?计时器通过发送Windows消息来工作,这意味着需要处理消息才能启动计时器。如果应用程序/主线程阻塞它不处理消息,定时器不会被触发。也许这是你的问题?

此外,如果您的应用程序是Windows服务或控制台应用程序,则可能无法处理消息。

答案 1 :(得分:2)

将Indy从等式中拿出来,看看你是否可以让它基本上每10秒抛出一次提示。如果没有,你做错了什么。就像误解间隔时间一样。例如,“(10000/10秒)”不是很清楚。我认为你的意思是“10000毫秒,这是10秒”,但你没有显示你的代码,所以我只能猜测。德尔福不会猜测,它会做你所说的。 无论如何,使用表单,按钮,编辑框和ttimer和实验制作一个示例应用程序。在介绍Indy之前,让计时器工作正常。然后你知道你是否有TTimer问题或Indy问题。

答案 2 :(得分:1)

您必须确保仅在主线程的上下文中调用TTimer的这些方法。由于Indy使用线程,很可能会违反此规则。为了便于查找,当代码在另一个线程的上下文中执行时,您可以调用Assert

Assert(GetCurrentThreadId = MainThreadId);
Self.Timer1.Enabled := False;
Self.Timer1.Enabled := True;

我不知道您的代码中Self指的是什么,但值得尝试。

答案 3 :(得分:0)

我在一个单独的线程中创建了一个Timer,一切都运行良好:)

谢谢大家,我学到了很多东西。