通过erlang gen event的gen_server行为模式实现一个角色进程,要求实现加经验、升级、加减金钱操作

erlang语言,gen_server.erl编译时出现错误。求大神指导_百度知道
erlang语言,gen_server.erl编译时出现错误。求大神指导
code_change(_OldVsn, _From.编译时;0])?SERVER}.-record(3,刚解除erlang没几天, State};SERVER&#39, code_change&#47?MODULE,怎么修改,; {noreply, State}.%% gen_server callbacks-export([init&#47.erl: function start_link&#47.-behaviour(gen_server);
gen_server, , State)
-&gt, State}, handle_info&#47, handle_call&#47, []), _State) -&2,提示如下.handle_cast(_Msg:5;2.handle_call(_R3]);gen_server, handle_cast&#47, {reply: undefined macro &#39, State.terminate(_Reason,纯新手.start_link() -&gt, State}.-export([start_link&#47.handle_info(_I2, {}).init([]) -& {noreply.erl:gen_ {0 undefined这是什么问题; {ok:12;
Reply = ok:start_link({local, ;1, State)
-&gt, _Extra) -& ok, #state{}}, terminate&#47, Reply-module(gen_server), [], State) -&gt
提问者采纳
第一个错误原因是你调用gen_server。第二个错误提示函数没有定义, ?SERVER 指向当前模块:start_link({local?MODULE),这种情况一般是符号错误, ?SERVER}, [].时宏,检查每个函数最后的句号和函数开头的-&gt?SERVER的定义, []),应该是书上的例子没有把打完全吧。解决这个问题在代码start_link()上一行前边加上-define(SERVER.这个时加入宏,让?MODULE?SERVER没有定义
提问者评价
谢谢,我虽然在你回答之前已经得到解决,但是还是谢谢你,回答的也是正确的。以后我有什么问题还来找你行吗
其他类似问题
为您推荐:
erl的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁转载自http://blog.csdn.net/zhangzhizhen1988/article/details/7932449
在阅读erlang的otp源码gen_server.erl的时候,一直想写点什么,用一种最好的方式表达出来,最终却总是没法表达清楚,困惑之余看到这篇文章,作者用图解的方式,非常清晰明了的表达了我一直想表达的东西,下面是原文链接:
/otp-gen_server-sourcecode
感谢原创作者热心的分享。
阅读OTP源码可以帮助你写出更好、更健壮的erlang程序.下面一系列文章就gen_server、gen_fsm、supervisor的源码进行分析, 从erlang级别解释其工作原理, 所有的完整流程图在这里, 第一次写erlang方面博文有错误请帮忙指出.
为什么从gen_server它开始, 因为gen_fsm和它很类似, 而supervsisor本身是一个gen_server.
图示为一个叫Mod的模块, 它是一个gen_server程序, 绿色方格为调用进程(客户进程), 黄色方格为spawn出的gen进程(服务进程). 不同的泳道表示函数所隶属的模块, 通过这个图可以清晰的看出各个模块至之间的相互调用, 图是使用所画。
从左上角的start(Args)开始,gen_server的程序Mod的开始函数都会调用gen_server:start(或者start_link)来创建一个服务进程,gen_server:start内部实际上调用的是gen模块。
gen模块是很多behaviour的基础,对于gen进程的启动和同步操作进行了封装.gen模块使用proc_lib:start来更加安全的spawn出gen进程,然后阻塞在sync_wait这个函数里,等待gen进程的回应.
spawn出的gen进程会执行到Mod模块的init函数。然后会把{ok, Pid}发送给调用进程告知gen进程已经完成准备工作,然后就进入了自己的循环函数loop中,等待调用进程的下次消息。
调用进程接收到{ok,Pid}之后从阻塞里退出并返回。
整个过程简单,但是要清楚哪个函数是被调用进程或者gen进程所执行。
另外要注意start函数的参数是Args,而init函数的入参是[Args],这个很容易出错的地方。
可以调用start/4或者start_link/4给启动的gen进程命名,函数name_register实际调用register函数.
init_it(GenMod, Starter, Parent, Name, Mod, Args, Options) -&
case name_register(Name) of
init_it2(GenMod, Starter, Parent, Name, Mod, Args, Options);
调用进程向gen进程发送cast消息,消息发送之后调用进程并不等待gen进程的消息回馈.
gen进程从loop函数处接受到Request消息,模式匹配后一路执行到Mod:handle_cast函数,处理消息之后,gen进程继续递归执行loop函数等待后续的新消息. 注意handle_cast不能返回{reply,…},否则gen进程会报错退出。
调用进程向gen进程发送call消息,和cast不同,调用进程会阻塞在wait_resp_mon函数里等待gen进程的回馈。收到消息后,gen进程会执行Mod:handle_call函数,并把执行的结果Reply直接发送给调用进程,然后自己再次进入循环等待新的消息。
wait_resp_mon(Node, Mref, Timeout) -&
{Mref, Reply} -&
erlang:demonitor(Mref, [flush]),
{ok, Reply};
{'DOWN', Mref, _, _, noconnection} -&
exit({nodedown, Node});
{'DOWN', Mref, _, _, Reason} -&
exit(Reason)
after Timeout -&
erlang:demonitor(Mref),
{'DOWN', Mref, _, _, _} -& true
after 0 -& true
exit(timeout)
默认情况下handle_call的返回是{reply,….}. 而调用进程阻塞在wait_resp_mon的默认超时时间是5s(-define(default_timeout, 5000)).
在spec里看到handle_call的返回值可以是{noreply,…}, &或者gen进程在处理其它事情而达到超时时间, 则调用进程会异常退出, 你也可以在调用gen_server:call/3来设置一个call命令的超时时间.
对于call和cast的命令既可以使用Name也可以使用Pid, &gen内部会进行Name到Pid的转化。
call(Name, Label, Request, Timeout)
when is_atom(Name), Timeout =:=
is_atom(Name), is_integer(Timeout), Timeout &= 0 -&
case whereis(Name) of
Pid when is_pid(Pid) -&
do_call(Pid, Label, Request, Timeout);
可以给gen进程发送任何格式的信息,这类信息没有gen标签,gen进程接收到这类消息会调用gen_server:handle_info来处理消息,处理过程与cast消息一样都不能反馈结果给调用进程,所以如果handle_info返回{reply,…}也会导致gen进程报错退出。
在handle_*等回调函数处都可以返回{stop,…} 这样使得gen进程执行Mod:terminate, 进行进程退出前的收尾工作, 然后回到主循环gen进程再退出.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:89210次
积分:1043
积分:1043
排名:千里之外
转载:58篇
评论:11条
(1)(1)(3)(3)(1)(3)(13)(3)(7)(3)(19)(6)1148人阅读
erlang(11)
之前erlang中自定义行为模式,需要导出behaviour_info函数,比如:
-module(gen_foo).
-export([behaviour_info/1]).
behaviour_info(callbacks) -&
[{foo, 0}, {bar, 1}, {baz, 2}];
behavior_info(_) -&
undefined.
在需要实现gen_foo行为模式的模块,添加-behaviour(gen_foo),实现相关的函数就行。
这种方式的缺点是,实现模块在实现函数时,没有类型规范的约束,约束只有函数名和元数。
已经存在的-spec关键字,不能使用在这种场景下,原因是spec用来规范约束函数定义和使用的。
erlang提出了新的关键字:callback,极大的简化了自定义行为模式的编码。代码如下:
-module(ranch_transport).
-callback messages() -& {OK::atom(), Closed::atom(), Error::atom()}.
编译期间使用 callback约束,自动生成behaviour_info导出函数,进一步检查实现行为模式的模块导出了所有的callback函数。
callback真心让自定义行为模式简化了不少。&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:344922次
积分:5416
积分:5416
排名:第2975名
原创:202篇
转载:25篇
评论:90条
(3)(1)(2)(4)(2)(3)(7)(1)(1)(1)(1)(9)(14)(2)(4)(7)(12)(12)(13)(1)(13)(8)(12)(35)(29)(31)}

我要回帖

更多关于 erlang gen tcp指定ip 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信