2011-04-12 95 views
1

我有3個定時器運行在我的應用程序上,它負責不同的操作。定時器1將處理應用程序的自動註銷,定時器2處理更新表格,定時器3處理更新擺動按鈕的顏色。第一個定時器使用基於變量及其值的計算,第二個和第三個定時器使用MYSQL查詢。擺動定時器的問題

現在,當我在平均性能機器上運行此應用程序時,應用程序不會移動。我需要等待幾秒鐘才能發生正常的點擊或打開一個窗口。這與定時器有關嗎?如果是,我是否有其他的建議來擺脫這個計時器問題? enter image description here

回答

2

這不應該與Swing定時器有關,這是你的代碼中的其他東西。您需要調試應用程序以查看導致延遲的原因。

+0

那麼你確定定時器不會讓應用程序凍結?應用程序將一直忙於整天忙碌。我可以同時運行5個定時器嗎? – Deepak 2011-04-12 16:01:26

+0

你確定你需要這麼多計時器嗎?如果必須的話,你可以在同一個功能中給他們不同的檢查間隔嗎?否則,答案必須在代碼中,讓我們看看它。 – Boro 2011-04-12 16:12:35

+1

@Deepak,如果你正在做一些可能會阻礙美國東部時間的事情,那麼你需要將其推遲。爲了證實這一點,你需要分析你的應用程序。只要你沒有在他們身上執行大任務,同時運行50個定時器就不是問題。 – jzd 2011-04-12 16:28:31

0

從我記得,擺動定時器在用於渲染的同一線程上觸發事件,所以你不會因爲不正確的線程中斷而導致異常 - 我過去曾經用它們來動畫而沒有問題 - 我懷疑答案位於代碼的其他地方。你有沒有嘗試在你遇到問題的時候分析代碼?

4

這很可能是定時器,如果他們在解僱時執行相當大的工作。對於長時間運行的任務使用擺動計時器通常不是一個好主意,因爲它們會阻止EDT並凍結UI。

這裏有一些建議,以避免這種情況:

  1. 使用java.util.Timer,而不是搖擺定時器。這將在後臺線程上運行數據庫代碼,避免阻塞事件隊列。
  2. 繼續使用擺動計時器,但使用計時器動作只需啓動SwingWorker即可執行該任務。如果這是一個需要一秒鐘左右才能執行的操作,那麼後臺處理的好處是可以將更新發布到您的用戶界面。

問題不在於你有多少定時器有,但每個計時器需要多久才能做的工作,因爲計時器的actionPerformed方法Swing事件線程上運行,這意味着當計時器正在做的事情,不會發生UI更新。

+1

+1。必須像@mdma所說的那樣,定時器正在做的一些操作是漫長的。閱讀關於swing Timer的Java教程:「通常,我們建議使用Swing定時器而不是通用定時器來執行與GUI相關的任務,因爲Swing定時器都共享相同的預先存在的定時器線程,並且與GUI相關的任務會自動在事件派發線程,但如果您不打算從計時器觸摸GUI或需要執行冗長的處理,則可以使用通用計時器。「 http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html – Boro 2011-04-12 16:18:53

0

如果我同時運行5個定時器可以嗎?

javax.swing.Timer的所有實例「使用單個共享線程執行它們的等待」。當胎面變得飽和時發生極限。實際上,每個Timer可能有多個偵聽器,但「處理程序必須快速執行以保持GUI響應。」