2010-09-20 167 views
1

正如你所知道的,我有我的应用程序内的TTimer VCL组件有点麻烦开发使用德尔福2010年TTimer为什么不能正确工作?

每当我打电话:

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

定时器组件,就好像确实停止,但是,它永远不会重新开始。就像它从不调用OnTimer事件。

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

在此先感谢:)

+4

目前尚不清楚你试图完成的设置Enabled为false,然后依次为true。我在Delphi中使用定时器没有任何问题。请发布您想要实现的更完整示例。 – 2010-09-20 10:40:46

回答

0

我创建了一个单独的线程一个定时器,一切都很好再次工作:)

谢谢你们,我学到了很多东西。

6

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

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

+0

基本上,我正在制作一个测验机器人。每X毫秒(10000/10秒)后,它会发出提示。如果用户得到了正确的问题,它将停止定时器(通过上述方法),并将发出下一个问题。希望我有道理:/ – user452577 2010-09-20 11:15:53

+0

如果是这种情况,我该如何解决它? – user452577 2010-09-23 07:26:09

+0

使用线程或不要使用Indy。不要在Windows服务或控制台应用程序中使用TTimer。 – 2010-09-26 17:46:41

2

把Indy排除在等式之外,看看你是否可以基本每10秒钟提示一次提示。如果没有,你做错了什么。像错误解释间隔时间。例如,“(10000/10秒)”不是很清楚。我认为你的意思是“10000ms是10秒”,但你不显示你的代码,所以我只能猜测。德尔福不会猜测,它会做你所说的。 无论如何,使用窗体,按钮,编辑框和ttimer和实验来制作示例应用程序。在介绍Indy的东西之前,先让计时器工作。然后你知道你是否有TTimer问题或Indy问题。

+0

好吧,我忘了提及Timer每10秒调用一次OnTimer事件。它在我不修改启用状态的情况下工作,但在我这样做之前,它停止调用OnTimer事件:/ – user452577 2010-09-21 06:38:02

0

您必须确保仅在主线程的上下文中调用这些TTimer的方法。由于Indy使用线程,所以违反这条规则可能就是这种情况。要找出容易,你可以在代码在另一个线程的上下文中执行调用Assert

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

我不知道是什么Self指的是在你的代码,但它是值得一试。

+0

自引用表单类。 – user452577 2010-09-21 06:38:21

+0

我试过了。它没有提出任何断言错误。 – user452577 2010-09-21 09:38:16