2011-05-02 75 views
5

假設您有一個gui組件,並且有10個線程都會告訴它在與單次繪製操作發生之前相同的時間重新繪製。與其天真地浪費資源重新繪製10次,只是合併/忽略除最後一個以外的所有東西,並重新繪製一次(或更可能兩次 - 第一次繪製一次,最後一次繪製一次)。我的理解是Swing重繪經理會這樣做。如何在Scala Actor中合併或跳過重複的郵件?

有沒有辦法在Scala Actor中完成同樣的行爲類型?有沒有辦法查看隊列和合並消息,或者忽略除某個特定類型的最後一個以外的所有內容?

+0

定義「最後一條消息」 – 2011-05-03 11:37:51

回答

4

像這樣的事情?:

act = 
    loop { 
    react { 
     case Repaint(a, b) => if (lastRepaint + minInterval < System.currentTimeMillis) { 
      lastRepaint = System.currentTimeMillis 
      repaint(a, b) 
    } 
    } 

如果要重繪每當演員的線程得到一個機會,但沒有更多的話: (更新:使用的最後一個消息參數重新繪製)

act = 
    loop { 
    react { 
     case [email protected](_, _) => 
     var lastMsg = r 
     def findLast: Unit = { 
      reactWithin(0) { 
      case [email protected](_, _) => 
       lastMsg = r 
      case TIMEOUT => repaint(lastMsg.a, lastMsg.b) 
      } 
     } 
     findLast 
    } 
    } 
+0

我不認爲這是需要的。在運行重繪之前,必須等到「最後」重新繪製消息,因爲隊列中的其他非重新繪製事件可能會導致需要重新繪製的更改。但是在你的例子中,最後一個事件可能在時間段內,因此被忽略,但是我們可能在重繪事件之間做了改變,所以現在我們不是最新的。 – mentics 2011-05-02 17:46:34

+0

我更新了我的答案。如果要處理重繪之間的事件,請將其處理添加到reactWithin塊中。 – IttayD 2011-05-03 05:06:04

+0

優秀。通過這種模式,人們可以抓住隊列中的所有物品,並將所有物品一起進行操作。 – mentics 2011-05-04 04:57:08