2010-09-20 227 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