2014-01-12 171 views
0

我第一次在erlang上工作。每次我尝试运行erlang进程时,它都会卡住,并且不会接受输入。我在eclipse中使用erlide插件来测试erlang代码。Erlang进程卡住了

代码是::

-module(message_router). 

%% ==================================================================== 
%% API functions 
%% ==================================================================== 
%%-compile(export_all). 
-export([start/0]). 
-export([stop/1]). 
-export([send_chat_message/3]). 
-export([route_messages/0]). 



%% ==================================================================== 
%% Internal functions 
%% ==================================================================== 
start() -> 
    spawn(message_router, route_messages, []). 

stop(RouterPid) -> 
    RouterPid ! shutdown. 

send_chat_message(RouterPid, Addressee, MessageBody) -> 
    io:format("send_chat_msg FROM:: ~p TO:: ~p ~n", [RouterPid, Addressee]), 
    RouterPid ! {send_chat_msg, Addressee, MessageBody}. 

route_messages() -> 

receive 
    {send_chat_msg, Addressee, MessageBody} -> 
     io:format("recv_chat_msg PID:: ~p ~n", [Addressee]), 
     Addressee ! {recv_chat_msg, MessageBody}, 
     route_messages(); 

    {recv_chat_msg, MessageBody} -> 
     io:format("Received: ~p~n", [MessageBody]); 

    shutdown -> 
     io:format("Shutting down ~n"); 

    Oops -> 
     io:format("Warning! Received: ~p~n", [Oops]), 
     route_messages() 
end. 

当我打试图在外壳

Eshell V5.10.4 
([email protected])1> P1 = message_router:start(). 
<0.1308.0> 
([email protected])2> P2 = message_router:start(). 
<0.1373.0> 
([email protected])3> chat_client:send_message(P1, P2, "FIRST Msg"). 
Sending chat message from chat_client 
send_chat_msg FROM:: <0.1308.0> TO:: <0.1373.0> 

运行的代码,就像每一件事我在shell中输入在此之后对效果。任何人都可以解释如何在erlang和最佳实践中处理循环。

[编辑]

聊天客户端代码:

-module(chat_client). 
-export([send_message/3]). 
send_message(RouterPid, Addressee, MessageBody) -> 
    io:format("Sending chat message from chat_client~n"), 
    message_router:send_chat_message(RouterPid, Addressee, MessageBody). 
+0

尝试调用'message_router:send_message(P1,P2,“FIRST Msg”)。 – aggelgian

+1

您是否查看过gen_servers?对于这样的例子来说,这是一个很好的做法,并且可以让你的工作变得更简单http://www.erlang.org/doc/man/gen_server.html | http://learnyousomeerlang.com/clients-and-servers –

+0

你能否显示chat_client:send_message代码? –

回答

0

问题的模块。调用此message_router:send_chat_message(P1, P2, "FIRST Msg")
看看下面这个例子,并比较一下他:

有模块调用observer它注册了两个过程loop/0trans/0

-module(observer). 
-export([observer/0, loop/0, trans/0]). 

observer() -> 
    register(loop, spawn(fun observer:loop/0)), 
    register(trans, spawn(fun observer:trans/0)). 

loop() -> 
    receive 
    {'PRINT', Msg} -> 
     io:format("print from ~p~n~p~n", [self(), Msg]), loop(); 
    {'EXIT', _FromPid} -> 
     io:format("Exit ~nFrom ~p", [_FromPid]), exit(self(), kill) 
    end. 

trans() -> 
    receive 
    {Command, Msg} -> io:format("transports from: ~p~n~p~n", [self(), Msg]), 
         loop ! {Command, Msg} 
    end. 

,并具有模块send_messenger一个功能send_message通过trans发送消息:

-module(send_messenger). 
-export([send_message/1]). 

send_message({Command, Msg}) -> 
    trans ! {Command, Msg}, 
    ok. 

我希望这对你有帮助!

+0

我厌倦了你的建议命令。我仍然陷入困境。我无法理解它如何循环route_message()。 –