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

Project1

 找回密码
 注册会员
搜索
查看: 2386|回复: 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
2
发表于 2011-4-24 13:31:21 | 只看该作者
1、会不会刮起线程

根据有限的上下文,for i in Game.temp.events[mapid] 这里的 i 枚举的是 Thread,但 Thread 默认没有 stop 这个实例方法。如果是自行定义的,那就需要具体实现才能判断。默认的库中有一个 Thread.stop 的单例方法可以挂起当前线程,除此之外没有别的直接挂起外部某线程的接口,但是可以通过在本来想挂起所有线程之前加一把互斥锁来实现同步。

战斗结束后恢复后执行continue_event(Game.temp.map_id)会不会继续执行show_Message(...)还是会傻乎乎的重头开始执行?

假设之前线程被挂起,那之后恢复了执行权后自然是继续执行。

Thread.pass、Thread.stop、Thread#run 等直接控制线程调度器的方法,在 Ruby 1.8 的绿色环境中的行为是可预知的,但是一旦涉及到 1.9 的本地线程,尤其是抢先式多任务系统下就很危险了,官方的文档说它们本身都不是线程安全的(不是原子操作),所以强烈不推荐使用。一切和同步有关的操作都应该由信号对象来控制,而 Ruby 中内置的只有互斥锁。Ruby 1.8 有 Thread.critical 这个变量来标记临界区的开始或结束,但在 1.9 中被废弃了。

Game会受到污染吗?

请定义“污染”。

Thread怎么Dump

不妨试试这个 Gem。
http://rubygems.org/gems/thread-dump/versions/0.0.1

怎么在下次运行的时候恢复到上次运行时的位置?

线程的基本行为就是这么被定义的。

Proc怎么dump

http://rubystuff.org/nodewrap/

Proc 包含了解释器内部的闭包数据,默认既然没有接口,所以只能 Hack 解释器了。

评分

参与人数 1星屑 +300 收起 理由
yangff + 300 Thx...

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

3
 楼主| 发表于 2011-4-24 13:34:26 | 只看该作者
本帖最后由 yangff 于 2011-4-24 13:37 编辑
苏小脉 发表于 2011-4-24 13:31
根据有限的上下文,for i in Game.temp.events[mapid] 这里的 i 枚举的是 Thread,但 Thread 默认没有 sto ...


问题是我用的RM= = ,污染请看¥SAFE

Thread.stop 的单例方法可以挂起当前线程

那要在外面怎么挂起他= =
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
4
发表于 2011-4-24 14:01:50 | 只看该作者
yangff 发表于 2011-4-24 13:34
问题是我用的RM= = ,污染请看¥SAFE

Thread.stop 的单例方法可以挂起当前线程

$SAFE 的设定是局部于块的,也就是在某个 proc 里设定的 $SAFE 只会影响该 proc 内部的对象。上面那段代码就是在 Thread.new 的块中设定 $SAFE 的,所以不会影响在外部就已经建立了的 Game 对象(Game 是一个 Module 的实例),Game.temp(虽然不知道是啥?),以及 Game.temp.events(一个 Hash 对象)。Thread.new 块内部的 yield 如果返回一个新分配的对象,那就会被污染。nil 是立即值,不会重新分配,所以 Game.temp.events 的元素也不会被污染。

那要在外面怎么挂起他= =

为什么非要挂起?如果是想同步,那完全可以通过信号对象实现,抑或是在线程内部添加一个标记的判断,外部将标记设为真的时候就不继续执行。1.9 是本地线程,在 Win32 下倒是可以通过 Ruby 扩展获取线程标识,然后传递给 SuspendThread,而 1.8 是解释器内部的调度器,除了 Hack 没别的办法。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

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

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

使用道具 举报

Lv1.梦旅人

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

使用道具 举报

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.
回复 支持 反对

使用道具 举报

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
我说了可以通过信号对象来实现。战斗开始后加锁,其它线程尽数被锁在外面,只有当前有钥匙的负责战斗过程 ...


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

使用道具 举报

Lv3.寻梦者

孤独守望

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

开拓者贵宾

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

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

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

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

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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