这是我正在开发的聊天中的一个问题。 主要方法有一个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)
}
}
}
}
}
谢谢你的帮助,但我仍然没有继续。 我像你告诉我的那样进行了修改,但它仍然没有用。
只有通过定义Actorempfä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)
}
}
}
}
}
}
我做错了什么?
答案 0 :(得分:1)
在接收事件时循环的演员有两种方式:
您正在使用两者的混合物(即同时反应)。由于以下原因,这根本不起作用:
接收阻止当前执行线程等待消息处理。它可以在while循环中使用;虽然你很少使用它,因为它将一个actor绑定到一个线程 - 即它不可伸缩,因为你每个actor使用1个线程。
请注意,react
方法的签名表示其返回类型为Nothing
。这意味着方法无法正常终止;它必须永远不会返回或抛出异常。实际上后者发生了;它使用异常作为流控制机制,只有在react
内使用loop
时才会起作用(假设您要继续处理事件)。因此,您的act
方法应该如下所示:
def act() {
loop {
react {
case msg: String =>
}
}
}
值得一看的是演员源代码,看看异常流控制是如何工作的,因为它是一件美丽的东西。
这是我为actor框架所做的努力。如果一个actor的反应抛出一个异常,那么这个actor会退出,并且没有记录这个是sys-out或sys-err是很常见的。这可能非常令人沮丧。
我强烈建议将 canary 演员链接到每个系统角色,以便按以下方式侦听退出:
def act() {
import Actor._
self link actor {
case Exit(from, msg) => /* your logging here */
}
loop { ...
}
}
}
但是,在您的情况下不起作用(再次,非常令人沮丧),因为您的整个act
方法会抛出异常。
答案 1 :(得分:0)
你在act方法中使用了while循环。当接收到消息时,该actor以异步方式工作并被激活。使用loop {}
代替while
,它应该有效。要停止演员,您必须向'stop
发送消息,并使用act
在exit
方法中对其做出反应。
答案 2 :(得分:0)
演员没有自动启动,这将是一件坏事。你必须明确地调用'start'方法,即你的main()empänger.start()