2011-05-02 3 views
5

gui 구성 요소가 있고 10 개의 스레드가 모두 단일 페인트 작업이 수행되기 전에 모두 도착할 때와 거의 동일한 시간에 다시 칠할 것을 지시한다고 가정 해 봅시다. 자원을 순전히 낭비하는 대신에 10 번 다시 칠하는 대신, 마지막 것을 제외하고 모두 병합/무시하고 한 번 다시 칠하기 (또는 더 가능성이 두 번, 처음에는 한 번, 마지막에는 한 번) 다시 칠하십시오. 나의 이해는 Swing repaint manager가 이것을 수행한다는 것이다.Scala Actor에서 중복 메시지를 병합하거나 건너 뛰는 방법은 무엇입니까?

Scala Actor에서 이와 동일한 유형의 동작을 수행하는 방법이 있습니까? 대기열을보고 메시지를 병합하거나 특정 유형 또는 무언가의 마지막을 제외하고 모두 무시하는 방법이 있습니까? 이 같은

+0

"마지막 메시지"를 정의하십시오. –

답변

4

뭔가 당신이 배우의 스레드가 기회를 얻을 때마다 다시 칠하기를 원하지만 경우

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

을? : 더 이상 다음 : (UPDATE : 마지막 메시지 인수를 사용하여 재 도장)

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

+0

답을 업데이트했습니다. 재 페인트간에 이벤트를 처리하려면 해당 처리를 reactWithin 블록에 추가하십시오. – IttayD

+0

우수. 이 패턴을 사용하면 대기열의 모든 항목을 가져 와서 모든 작업을 함께 수행 할 수 있습니다. – mentics

관련 문제