查看: 3849|回复: 5

[已经解决] 求教Proc和Thread

[复制链接]
梦石
0
星屑
55
在线时间
465 小时
注册时间
2011-4-13
回帖
146
发表于 2014-3-22 21:53:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 heiwang1997 于 2014-3-22 21:55 编辑

XP默认脚本中,解释器3中有这样的代码:
[pre lang="ruby" line="1"]$game_temp.message_proc = Proc.new { @message_waiting = false }[/pre]
求大神指教这是什么意思!

另外,RGSS高版本中还提供了Thread类,允许处理多进程,和这个Proc有什么区别?其critical属性是指什么?
还有还有,在程序中这样写对吗,会造成内存浪费什么的吗?
[pre lang="ruby" line="1"]class Scene_XXX
  def main
    # 创建一个线程
    @thre ad = Thread.new{loop do;Graphics.update;Input.update;end}
    # 渐变
    Graphics.transition
    loop do
      # 无限循环
      break if false
    end
    Graphics.freeze
    # 杀死进程,释放内存
    @thread.kill
  end
end[/pre]

现在我想要创建一个代码块,包含loop do循环,想和主进程并行,但并不立即执行,是应该用proc再call呢,还是用thread先stop需要使用时在run或是wakeup呢?

菜鸟求教!
另外,虽然问题很多,但是关于一个冷门话题不想多发这么多贴,所以版主见谅哈~扣分手下留情  
梦石
0
星屑
55
在线时间
465 小时
注册时间
2011-4-13
回帖
146
 楼主| 发表于 2014-3-29 16:47:47 | 显示全部楼层
本帖最后由 heiwang1997 于 2014-3-30 14:04 编辑

@hys111111  @天地有正气 跪求版主帮我移到RM技术去吧,这里好像没有人对这个问题感兴趣~
谢谢谢谢!  
回复

使用道具 举报

梦石
0
星屑
2306
在线时间
1010 小时
注册时间
2012-4-30
回帖
1455

开拓者

发表于 2014-4-12 16:43:11 | 显示全部楼层
本帖最后由 恋′挂机 于 2014-4-13 13:48 编辑

Proc的话 就是拿来存储代码供稍后调用。。
官方文档  是ruby1.9.3之后支持
  1. a = Proc.new { puts "Hello World!" }
  2. a.call# => "Hello World!"
复制代码
看出输出的信息其实就相当于执行一次尖括号内的语句

而Thread咱就不懂了。。
然后求版主帮代码框一下。。

点评

http://www.kuqin.com/rubycndocument/man/built-in-class/class_object_thread.html中文ruby手册上的线程类可以自己看得话看这个不错。。爪机无力研究  发表于 2014-4-12 16:44
回复

使用道具 举报

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
发表于 2014-11-8 23:05:33 | 显示全部楼层
本帖最后由 寒冷魔王 于 2014-11-8 23:11 编辑
铅笔描绘的思念 发表于 2014-4-12 16:43
Proc的话 就是拿来存储代码供稍后调用。。
官方文档  是ruby1.9.3之后支持看出输出的信息其实就相当于执行 ...

Proc.new{&block}
Thread.new{&block}
貌似{&block}里的被传递过来都成为Proc呢?[pre lang="ruby" line="1"]def pp(&block)
  return block
end
p pp{p "Hello"}
[/pre]Thread是线程,可以并行运行程序,很有用的。(话说我也是最近才学的)
另外[pre lang="ruby" line="1"]def pp(&block)
  instance_eval &block
end
def pp(&block)
  block.call
end
[/pre]
两个貌似是一样的?

点评

当然不一样……  发表于 2014-11-9 08:13
回复

使用道具 举报

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
发表于 2014-11-9 08:48:03 | 显示全部楼层
@taroxd   找到了……

如果没有使用instance_eval,如下面的代码,ruby就会抛出一个NoMethodError,因为source、owner、mode无法在block中被访问到。
[pre lang="ruby" line="1"]    class TemplateDSL
      def initialize(path, &block)
        @path = path
        block.call
      end
    end[/pre]当然也可以使用yeild传递变量的方式实现,但没有instance_eval简洁和灵活。

点评

谢了~  发表于 2014-11-9 09:02
http://rm.66rpg.com/thread-369676-1-1.html  发表于 2014-11-9 09:00

评分

参与人数 1星屑 +100 收起 理由
恐惧剑刃 + 100 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2014-11-9 12:19:31 | 显示全部楼层
寒冷魔王 发表于 2014-11-8 06:05
Proc.new{&block}
Thread.new{&block}
貌似{&block}里的被传递过来都成为Proc呢?def pp(&block)

半年前的贴都被你们挖出来了···

点评

那就不知了···  发表于 2014-11-9 13:14
没有  发表于 2014-11-9 13:14
目测是之前被广告机挖出来的  发表于 2014-11-9 13:13
都在第一页……另外我想说为什么我2年前的帖子也在第一页?  发表于 2014-11-9 13:12
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部