假設您有一個gui組件,並且有10個線程都會告訴它在與單次繪製操作發生之前相同的時間重新繪製。與其天真地浪費資源重新繪製10次,只是合併/忽略除最後一個以外的所有東西,並重新繪製一次(或更可能兩次 - 第一次繪製一次,最後一次繪製一次)。我的理解是Swing重繪經理會這樣做。如何在Scala Actor中合併或跳過重複的郵件?
有沒有辦法在Scala Actor中完成同樣的行爲類型?有沒有辦法查看隊列和合並消息,或者忽略除某個特定類型的最後一個以外的所有內容?
假設您有一個gui組件,並且有10個線程都會告訴它在與單次繪製操作發生之前相同的時間重新繪製。與其天真地浪費資源重新繪製10次,只是合併/忽略除最後一個以外的所有東西,並重新繪製一次(或更可能兩次 - 第一次繪製一次,最後一次繪製一次)。我的理解是Swing重繪經理會這樣做。如何在Scala Actor中合併或跳過重複的郵件?
有沒有辦法在Scala Actor中完成同樣的行爲類型?有沒有辦法查看隊列和合並消息,或者忽略除某個特定類型的最後一個以外的所有內容?
像這樣的事情?:
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
}
}
我不認爲這是需要的。在運行重繪之前,必須等到「最後」重新繪製消息,因爲隊列中的其他非重新繪製事件可能會導致需要重新繪製的更改。但是在你的例子中,最後一個事件可能在時間段內,因此被忽略,但是我們可能在重繪事件之間做了改變,所以現在我們不是最新的。 – mentics 2011-05-02 17:46:34
我更新了我的答案。如果要處理重繪之間的事件,請將其處理添加到reactWithin塊中。 – IttayD 2011-05-03 05:06:04
優秀。通過這種模式,人們可以抓住隊列中的所有物品,並將所有物品一起進行操作。 – mentics 2011-05-04 04:57:08
定義「最後一條消息」 – 2011-05-03 11:37:51