じ☆ve冰风 发表于 2024-4-12 22:48:05

获取Fiber实例的状态编号,定义alive?

根据官方文档:http://ruby-doc.org/core-2.2.0/Fiber.html
使用fiber实例的alive?方法需要
You need to require 'fiber' before using this method.
有时候VA里也需要这么个操作,所以就出现了下面的玩意儿
思路也很简单,因为在resume一个status为TERMINATED的fiber时,会抛出dead fiber异常,
也就是说本身Fiber就存在判定自身状态的方法。通过这个提示的位置逆向出储存状态编号的地址,接着根据官方提供的源码逻辑,来定义alive?方法

RUBY 代码
class Fiber

Memcopy = Win32API.new('kernel32','RtlMoveMemory','pll','l')

CREATING = 0
RUNNING = 1
TERMINATED = 2

def status
    buf = "\0"*4
    Memcopy.call(buf,self.object_id*2+16,4)
    objPtr = buf.unpack("L").first
    return0if objPtr == 0
    Memcopy.call(buf,objPtr+480,4)
    return buf.unpack("L").first
end

def alive?
    returnself.status != TERMINATE
end

end




             本帖来自P1论坛作者chd114,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=404325若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 获取Fiber实例的状态编号,定义alive?