设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2387|回复: 12
打印 上一主题 下一主题

[已经过期] [还是让这个帖子在水区吧][Ruby]召唤……求Dump

[复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2011-4-24 10:50:45 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 yangff 于 2011-4-26 00:16 编辑
  1. module Game
  2.   module Safe
  3.     module_function
  4.     def safe(level,join=false,mid=nil,eid=nil)
  5.       result = nil
  6.       #Game.temp.events[mid][eid]
  7.       
  8.       k = Thread.start {
  9.         $SAFE = level
  10.         result = yield
  11.         Game.temp.events[mid][eid]=nil if mid!=nil and eid!=nil
  12.       }
  13.       if mid!=nil and eid!=nil
  14.         Game.temp.events[mid]={} if Game.temp.events[mid].nil?
  15.         Game.temp.events[mid][eid] = k
  16.       end
  17.       k.join if join
  18.         
  19.       #p "exit:"
  20.       result
  21.     end
  22.   end
  23. end
  24. #alias new_eval eval
  25. #def eval(*args)
  26.   
  27. # Game::Safe.safe(3) { new_eval(args)}
  28. #end
  29. #事件响应方法
  30. def startevent(mapid,eventid,join)
  31.   Game::Safe.safe(3,join,mapid,eventid) { yield }
  32. end
  33. def continue_event(mapid)
  34.   for i in Game.temp.events[mapid]
  35.     i.run
  36.   end
  37. end
  38. def change_map_of_ev(mapid)
  39.   for i in Game.temp.events[mapid]
  40.     i.stop
  41.   end
  42. end
  43. module Events
  44.   def self.run(event,mapid,eventid,join=true) #event=Proc.new {
  45.     startevent(mapid,eventid,join) { event.call }
  46.   end
  47. end
复制代码
这样写,如果在event里面写
Game.scene="Battle"
change_map_of_ev(Game.temp.map_id)
show_Message(...)
1、会不会刮起线程
2、战斗结束后恢复后执行continue_event(Game.temp.map_id)会不会继续执行show_Message(...)还是会傻乎乎的重头开始执行?
3、Game会受到污染吗?
0----------------------------------------------------------------------------------------------------0
Thread怎么Dump
如果不能Dump怎么在下次运行的时候恢复到上次运行时的位置?
0----------------------------------------------------------------------------------------------------0
还有同样的dump问题,Proc怎么dump

点评

猛抽杨菲菲~  发表于 2011-4-25 12:40
fuck亮了  发表于 2011-4-25 12:10
经验 - 1 一贴多问  发表于 2011-4-24 11:03
哎呀,蛋疼什么的最有爱了

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
13
发表于 2011-4-26 00:25:10 | 只看该作者
本帖最后由 苏小脉 于 2011-4-26 00:25 编辑
yangff 发表于 2011-4-26 00:04
可是那如果我的代码不是loop而是这样的
showMessage(...)
showMessage(...)


可以用 Thread.critical。

  1. Thread.critical = true
  2. # ... 临界区 ...
  3. Thread.critical = false
复制代码
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

12
 楼主| 发表于 2011-4-26 00:04:18 | 只看该作者
可是那如果我的代码不是loop而是这样的
showMessage(...)
showMessage(...)
...
showAni(...)
那岂不是要
showMessage(...)if !lock.locked?
showMessage(...) if !lock.locked?
...
showAni(...) if !lock.locked?
甚至showMesage里面也要……
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
11
发表于 2011-4-25 23:17:37 | 只看该作者
本帖最后由 苏小脉 于 2011-4-25 23:21 编辑
yangff 发表于 2011-4-25 22:38
可战斗和地图都在主线程,事件在子线程,要给虾米东西上锁呢?


给单个共享的锁上锁,也就是只能是 0 或者 1 的二元信号量。

  1. lock = Mutex.new
  2. # ...
  3. Thread.fork do
  4.   if !lock.locked?
  5.     # ...
  6.   end
  7. end
  8. # ...
  9. lock.lock
  10. # ...
  11. # 战斗过程
  12. # ...
  13. lock.unlock
复制代码
只有事件线程之间异步执行才需要用这种可重入的 Mutex.locked? 判断方式。

1.9 可以直接用 Thread.exclusive do ... end 执行临界区,1.8(RM)的话,在战斗开始前打开 Thread.critical 开关,结束后关闭也能实现相同的效果。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

10
 楼主| 发表于 2011-4-25 22:38:30 | 只看该作者
IamI 发表于 2011-4-25 18:47
互斥锁,在此对象被解锁以前其他线程不能操作。

可战斗和地图都在主线程,事件在子线程,要给虾米东西上锁呢?
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

9
发表于 2011-4-25 18:47:11 | 只看该作者
互斥锁,在此对象被解锁以前其他线程不能操作。
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

8
 楼主| 发表于 2011-4-25 18:01:45 | 只看该作者
本帖最后由 yangff 于 2011-4-25 18:02 编辑
苏小脉 发表于 2011-4-25 02:26
我说了可以通过信号对象来实现。战斗开始后加锁,其它线程尽数被锁在外面,只有当前有钥匙的负责战斗过程 ...


[信号对象]是什么= =求门 ,不大理解
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
7
发表于 2011-4-25 02:26:23 | 只看该作者
yangff 发表于 2011-4-24 17:37
必须要挂起啊= =比如线程执行一般调用战斗,自然是要暂停这个地图里面的线程,等战斗完了再恢复……这些 ...

我说了可以通过信号对象来实现。战斗开始后加锁,其它线程尽数被锁在外面,只有当前有钥匙的负责战斗过程的线程有权执行。

点评

脉子大人这些玩意完全超越我的理解范围= =  发表于 2011-4-25 14:01
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
3 小时
注册时间
2010-10-24
帖子
19
6
发表于 2011-4-24 22:14:25 | 只看该作者
- -哪个混蛋转的= =咱这是VX啊fuck2拜托了……
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

5
 楼主| 发表于 2011-4-24 17:37:43 | 只看该作者
苏小脉 发表于 2011-4-24 14:01
$SAFE 的设定是局部于块的,也就是在某个 proc 里设定的 $SAFE 只会影响该 proc 内部的对象。上面那段代 ...

必须要挂起啊= =比如线程执行一般调用战斗,自然是要暂停这个地图里面的线程,等战斗完了再恢复……这些线程自然五花八门,有触发战斗的线程,有并行处理的,巴拉巴拉……
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-2-26 22:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表