扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 142|回复: 0

[转载发布] 获取Fiber实例的状态编号,定义alive?

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2024-11-27 10:08
  • 签到天数: 108 天

    连续签到: 4 天

    [LV.6]常住居民II

    2219

    主题

    376

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    9661
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    12284

    灌水之王

    发表于 2024-4-12 22:48:05 | 显示全部楼层 |阅读模式
    根据官方文档: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 代码
    1. class Fiber
    2.   Memcopy = Win32API.new('kernel32','RtlMoveMemory','pll','l')
    3.   CREATING = 0
    4.   RUNNING = 1
    5.   TERMINATED = 2
    6.   def status
    7.     buf = "\0"*4
    8.     Memcopy.call(buf,self.object_id*2+16,4)
    9.     objPtr = buf.unpack("L").first
    10.     return0if objPtr == 0
    11.     Memcopy.call(buf,objPtr+480,4)
    12.     return buf.unpack("L").first
    13.   end
    14.   def alive?
    15.     returnself.status != TERMINATE
    16.   end
    17. end
    复制代码




                 本帖来自P1论坛作者chd114,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=404325  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-1-16 00:44 , Processed in 0.069552 second(s), 58 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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