2010-07-15 10 views
5

Başka bir aktörün sinyalini beklemek için bir aktör 'uyumaya' çalışıyorum. Ben:Bir scala oyuncusu nasıl yapılır 'sinyali bekle' ama hiç mesaj atma.

def act(){ 
    loop{ //Should I use loop here too?? 
     if(sleepy){ 
      react{ 
        //SLEEPING 
        case "Wake Up"=> sleepy=false; //just to breack the react 
      } 
     }else{ 
      react{ 
       //React to other messages 
      } 
     } 
    } 
} 

Aktörüm uyurken diğer iletilerle ne oluyor? Ayrılmışlar mı? Onları kaybetmek istemiyorum. Bunu düzeltmenin iyi bir yolu nedir?

cevap

6

Reaksiyon bloğundaki diğer durumlarda bir koruyucu kullanabilirsiniz, tepki bloğundaki eşsiz mesajlar, oyuncunun mesaj kuyruğunda tutulur. Oyuncunun kuyruk büyüklüğü aşırı olduğundan önce kesinlikle "uyandırılmaya" dikkat edin.

Doğru hatırlıyorsam, tepki tasarımından dolayı döngüde yalnızca bir tepki bloğu olabilir.

val receiver = new Actor { 
    private var sleeping = true 

    def act { 
    loop { 
     react { 
     case "Wake Up"  => println("waking up"); sleeping = false 
     case x if ! sleeping => println("processing "+x) 
     } 
    } 
    } 
} 

receiver.start 

import Thread.sleep 

receiver ! "Message 1" 
sleep(2000L) 
receiver ! "Message 2" 
sleep(2000L) 
receiver ! "Wake Up" 
sleep(2000L) 
receiver ! "Message 3" 
sleep(2000L) 
receiver ! "Message 4" 

işleme İleti 1 işleme İleti 2 işleme Mesaj 3 işleme Mesaj 4

6

için Don benzer bir mekanizma kullanır ama Actor.Body sağladığı andThen işlevselliği olanaklar sunar uyanma:

def waitForSignal :() => Unit = react { case Signal(_) => } 

def processMessages :() => Unit = loop { 
    react { 
     case x => //process 
    } 
} 

def act() = waitForSignal andThen processMessages 

Açık dönüşlü bildirim bildiriminin nedeni () => Unit, react'un hiç bir zaman normal olarak sonlanmamasıdır (ör. Nothing döndürür. Nothing, tür hiyerarşisinin altında ve başka türden geçerli bir alt türdür.

I andThen yöntemi içeren Body sınıfına ilişkin bir () => Unit örtük dönüştürme avantaJýný.

İlgili konular