2013-07-12 32 views
0

我有一個GUI,GUI正在啓動另一個線程(Java)。這個線程正在開始抓取很多網站的類。現在我想在GUI中展示有多少網站被抓取以及剩下多少網站。 我不知道什麼是最好的解決方案。在GUI中顯示另一個線程的狀態

第一個想法是在GUI中啓動一個計時器,並定期向爬蟲詢問剩下多少。但我想這是相當髒的...

然後,可以將GUI傳遞給抓取工具,並且每次就緒網站計數發生變化時它都會調用GUI方法。但我不認爲這好多了?

做這種事情的最好方法是什麼?

+0

只允許GUI線程調用GUI方法。你不能將它傳遞給另一個線程。 –

+0

@ErikEkman那麼,從技術上講,你可以,但是隨後會遇到很多'invokeLater's ...更好使用'SwingWorker':P - 還有責任問題 - 誰負責更新UI - 回答你,我會想出這個GUI類,爬蟲是一個爬蟲,讓它抓取:P – MadProgrammer

回答

1

這取決於。

問問爬蟲工作完成了多少工作並不是一個壞主意。好處是您可以實際控制何時發生更新並可以平衡負載。

缺點是信息可能會很快失效,並且您可能永遠不會得到準確的結果,因爲在您讀取值時,抓取工具可能已經更改了它們。

您可以讓抓取工具提供一個回調界面,GUI會向其註冊,當抓取工具更新其狀態時,會回調GUI。

這裏的問題在於用戶界面可能會因結果而淹沒,導致其滯後。同樣地,當履帶被解僱這些通知,但不這樣做的工作......

(假設搖擺)

在這兩種情況下,你需要確保任何想法您對UI是在事件派發線程內完成的。這意味着如果您使用回調方法,則返回的更新將來自搜尋器線程上下文。您需要使用EDT重新同步這些。

在這種情況下,您可以簡單地使用SwingWorker,它提供了將更新同步到EDT的機制。

退房Concurrency in Swing更多細節

0

註冊一個回調函數到你的線程。當你的數據很髒時,調用這個回調函數來通知GUI線程進行更新。不要忘記使用同步。

+0

不要忘記確保在EDT的上下文中執行UI的所有更新,如果使用Swing – MadProgrammer

相關問題