繁体   English   中英

为什么TTimer无法正常工作?

[英]Why doesn't TTimer work correctly?

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

每当我打电话给:

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

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

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

提前致谢 :)

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

同样,如果您的应用程序是Windows服务或控制台应用程序,则可能不会处理该消息。

将Indy排除在等式之外,看看是否可以使它基本上每10秒抛出一次提示。 如果不是,则说明您做错了。 喜欢误解间隔时间。 例如,“(10000/10秒)”不是很清楚。 我认为您的意思是“ 10000毫秒即10秒”,但是您不显示代码,所以我只能猜测。 Delphi不会猜测,它将按您所说的做。 无论如何,制作一个带有表单,按钮,编辑框,计时器和实验的示例应用。 在介绍Indy之前,请先使计时器工作。 然后,您知道您遇到了TTimer问题还是Indy问题。

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

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

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

我在一个单独的线程中创建了一个Timer,一切再次正常运行:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM