1

これは私が開発しているチャットの問題です。メイン メソッドを持つメイン/GUI オブジェクト、メッセージを送信するアクター センダー、メッセージを受信する empfänger があります。問題は、受信メッセージを表示するために empfänger に main/gui オブジェクトの関数を使用させることです。うまくいかなかったので、単純化しましたが、それでも問題は解決しませんでした。これがターミナルで何も返さない理由を誰か教えてもらえますか? 私は何を間違っていますか?

import scala.actors._
object main_object {
    def infoterm(msg: String) = {
        println(msg)
    }
    def main(args: Array[String]) = {
    println("hallo")
    empfänger ! "foo"


    }
}


object empfänger extends Actor{
    var port = 50042
    var name = "local"
    var continuevar = true
    def foo(in: String) = {
        println("foo-empfänger" + in)
    }
    def act() {
        println("ydfjskj")
        test2.infoterm("tut")
        println("Empfänger gestartet")
        while(continuevar) {
            react {
                case msg:String  => {
                    println("empfänger" + msg)
                    test2.infoterm(msg)
                    foo("empfänger" + msg)
                }
            }
        }
    }
}

助けてくれてありがとう、でもまだうまくいかない。教えていただいた通りに修正したのですが、うまくいきません。

次のように、Actor empfänger を定義するだけで、プログラム全体が機能しなくなります。

import scala.actors._
object test2 {
    def infoterm(msg: String) = {
        println(msg)
    }
    def main(args: Array[String]) = {
    println("hallo")
    }
}

object empfänger extends Actor{
    def act() {
        // test2.infoterm("tut")
        // println("Empfänger gestartet")
        loop {
            react {
                case msg:String  => {
                    if(msg == "Stop") exit()
                    else {
                    println("empfänger" + msg)
                    // test2.infoterm(msg)
                    }
                }
            }
        }
    }
}

私は何を間違っていますか?

4

3 に答える 3

1

イベントの受信時にアクター内からループする方法は 2 つあります。

  1. 受信中
  2. ループ反応

2 つの混合物 (つまり、while-react) を使用しています。これは、次の理由で機能しません。

受け取る

Receiveは、メッセージが処理されるのを待っている現在の実行スレッドをブロックします。while ループで使用できます。ただし、アクターを 1 つのスレッドに結び付けるため、これを使用することはめったにありません。つまり、アクターごとに 1 つのスレッドを使用するため、スケーラブルではありません。

反応する

メソッドのシグネチャで、react戻り値の型が であることが示されていることに注意してくださいNothing。これは、メソッドが正常に終了できないことを意味します。決して返さないか、例外をスローしてはなりません。実際、後者が起こります。react内部で使用する場合にのみ機能するフロー制御メカニズムとして例外を使用loopします (継続的にイベントを処理する場合)。したがって、actメソッドは次のようになります。

def act() {
  loop {
    react {
      case msg: String => 
    }
  }
}

アクターのソース コードを見て、例外フロー制御がどのように機能するかを確認することは非常に価値のあることです。

エラー メッセージ: アクターのリンク

これは、アクター フレームワークに関して私が苦労してきたことです。アクターの反応が例外をスローした場合、アクターは終了し、これが sys-out または sys-err であるという記録がないことは非常に一般的です。それは非常にイライラすることがあります。

次のように、 Canaryアクターを各システム アクターにリンクして、終了をリッスンすることを強くお勧めします。

def act() {
  import Actor._
  self link actor {
    case Exit(from, msg) => /* your logging here */
  }
  loop { ...
  }  
 }
}

ただし、メソッド全体が例外をスローするため、これはあなたのケースでは機能しません(これも非常にイライラします)。act

于 2012-05-18T07:09:15.197 に答える
0

アクターは自動的に開始されません。これは悪いことです。main() empänger.start() で明示的に「開始」メソッドを呼び出す必要があります。

于 2012-05-19T12:05:17.170 に答える
0

act メソッド内で while ループを使用しています。アクターは非同期で動作し、メッセージを受信するとアクティブ化されます。loop {}の代わりに使用するとwhile、動作するはずです。アクターを停止するには、 のようなメッセージを送信し、メソッドで を使用'stopして反応する必要があります。actexit

于 2012-05-17T23:19:00.760 に答える