正如你所知道的,我有我的应用程序内的TTimer VCL组件有点麻烦开发使用德尔福2010年TTimer为什么不能正确工作?
每当我打电话:
Self.Timer1.Enabled := False;
Self.Timer1.Enabled := True;
定时器组件,就好像确实停止,但是,它永远不会重新开始。就像它从不调用OnTimer事件。
我将它与Indy10 IRC组件(TIdIRC)结合使用。
在此先感谢:)
正如你所知道的,我有我的应用程序内的TTimer VCL组件有点麻烦开发使用德尔福2010年TTimer为什么不能正确工作?
每当我打电话:
Self.Timer1.Enabled := False;
Self.Timer1.Enabled := True;
定时器组件,就好像确实停止,但是,它永远不会重新开始。就像它从不调用OnTimer事件。
我将它与Indy10 IRC组件(TIdIRC)结合使用。
在此先感谢:)
我创建了一个单独的线程一个定时器,一切都很好再次工作:)
谢谢你们,我学到了很多东西。
您还知道,大多数Indy电话都阻止?计时器通过发送Windows消息来工作,这意味着需要处理消息才能启动计时器。如果应用程序/主线程阻止它不处理消息,并且定时器不会被触发。也许这是你的问题?
另外,如果您的应用程序是Windows服务或控制台应用程序,则可能无法处理消息。
基本上,我正在制作一个测验机器人。每X毫秒(10000/10秒)后,它会发出提示。如果用户得到了正确的问题,它将停止定时器(通过上述方法),并将发出下一个问题。希望我有道理:/ – user452577 2010-09-20 11:15:53
如果是这种情况,我该如何解决它? – user452577 2010-09-23 07:26:09
使用线程或不要使用Indy。不要在Windows服务或控制台应用程序中使用TTimer。 – 2010-09-26 17:46:41
把Indy排除在等式之外,看看你是否可以基本每10秒钟提示一次提示。如果没有,你做错了什么。像错误解释间隔时间。例如,“(10000/10秒)”不是很清楚。我认为你的意思是“10000ms是10秒”,但你不显示你的代码,所以我只能猜测。德尔福不会猜测,它会做你所说的。 无论如何,使用窗体,按钮,编辑框和ttimer和实验来制作示例应用程序。在介绍Indy的东西之前,先让计时器工作。然后你知道你是否有TTimer问题或Indy问题。
好吧,我忘了提及Timer每10秒调用一次OnTimer事件。它在我不修改启用状态的情况下工作,但在我这样做之前,它停止调用OnTimer事件:/ – user452577 2010-09-21 06:38:02
您必须确保仅在主线程的上下文中调用这些TTimer
的方法。由于Indy使用线程,所以违反这条规则可能就是这种情况。要找出容易,你可以在代码在另一个线程的上下文中执行调用Assert
:
Assert(GetCurrentThreadId = MainThreadId);
Self.Timer1.Enabled := False;
Self.Timer1.Enabled := True;
我不知道是什么Self
指的是在你的代码,但它是值得一试。
自引用表单类。 – user452577 2010-09-21 06:38:21
我试过了。它没有提出任何断言错误。 – user452577 2010-09-21 09:38:16
目前尚不清楚你试图完成的设置Enabled为false,然后依次为true。我在Delphi中使用定时器没有任何问题。请发布您想要实现的更完整示例。 – 2010-09-20 10:40:46