1

这是我正在开发的聊天中的一个问题。有一个带有 main 方法的 main/gui 对象,一个发送消息的 Actor 发送者和一个接收消息的 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

在接收到事件时,actor 内部有两种循环方式:

  1. 接收时
  2. 循环反应

您正在使用两者的混合物(即 while-react)。这根本行不通,原因如下:

收到

Receive阻塞当前执行线程等待消息处理。它可以在while循环中使用;尽管您应该很少使用它,因为它将一个参与者绑定到一个线程 - 即它不可扩展,因为每个参与者使用 1 个线程。

反应

请注意,该react方法的签名表明它的返回类型是Nothing. 这意味着该方法无法正常终止;它必须永远不会返回或抛出异常。事实上后者发生了;它使用异常作为流控制机制,仅当您react在内部使用时才有效loop(假设您想要持续处理事件)。所以你的act方法应该是这样的:

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

非常值得看一下 actor 源代码,以了解异常流控制是如何工作的,因为它是一件美丽的事情。

错误消息:链接参与者

这是我为演员框架而苦苦挣扎的事情。如果演员的反应引发异常,演员退出并且没有记录是很常见的,这是 sys-out 或 sys-err。这可能非常令人沮丧。

我强烈建议将金丝雀演员链接到每个系统演员以监听退出,如下所示:

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 循环。Actor 异步工作并在收到消息时被激活。使用loop {}代替,while它应该可以工作。要停止一个演员,你必须向它发送一条消息'stop,并在你的act方法中使用exit.

于 2012-05-17T23:19:00.760 回答