LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
楼主: lbabey

[协程]实现 sleep 功能,捎带点小玩意。

[复制链接]
 楼主| 发表于 2025-8-23 21:32:38 | 显示全部楼层
z22904220 发表于 2025-8-23 05:42 PM
魔蜂运行的结果就打印一行???

你可能也没有C_Timer的函数
回复 支持 反对

使用道具 举报

发表于 2025-8-25 09:21:06 | 显示全部楼层
要正常使用 Wait(second) 必须要再次封装在要实现的过程函数中,并且是过程函数的参数中三次封装,才能生效
虽然有些麻烦 但总比没有要好
比如
[Lua] 纯文本查看 复制代码
cmd1 
wait()
cmd2


这样是行不通的 因为cmd1 cmd2会几乎同时运行
[Lua] 纯文本查看 复制代码
local function test()--第二次封装
  coroutine.wrap(
              function()--第三次封装 且封装在coroutine.wrap的参数中
                cmd1
                Wait(2)
                cmd2
              end
                 )
  ()--没错这是上面coroutine.wrap函数的函数体
end

这样才能保证实现cmd1 Wait()(延迟) cmd2



点评

1.首先创建一个函数 2.函数功能是一个协程 3.协程执行A,wait,B.... 4.wair是先暂停协程,然后在设置的 2秒 后,恢复协程  详情 回复 发表于 2025-8-25 01:32 PM
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-25 13:32:47 | 显示全部楼层
星流银河 发表于 2025-8-25 09:21 AM
要正常使用 Wait(second) 必须要再次封装在要实现的过程函数中,并且是过程函数的参数中三次封装,才能生效 ...

1.首先创建一个函数
2.函数功能是一个协程
3.协程执行A,wait,B....
4.wait是先暂停协程,然后在设置的 2秒 后,恢复协程
回复 支持 反对

使用道具 举报

发表于 2025-8-25 21:36:03 | 显示全部楼层
[Lua] 纯文本查看 复制代码
-------------------------------------------------------
--- 官方是在6.0.2版本才添加的C_Timer,
--- 在这之前都是由其他第三方插件提供C_Timer功能
-------------------------------------------------------
if not C_Timer or C_Timer._version ~= 2 then
    local tinsert = table.insert;
    local tremove = table.remove;
    
    C_Timer = C_Timer or {};
    C_Timer._version = 2;
    
    local TickerPrototype = {};
    local TickerMetatable = {
        __index = TickerPrototype,
        __metatable = true
    };
    
    local waitTable = {};
    local waitFrame = TimerFrame or CreateFrame("Frame", "TimerFrame", UIParent);
    waitFrame:SetScript("OnUpdate", function(self, elapsed)
            local total = #waitTable;
            local i = 1;
            
            while i <= total do
                local ticker = waitTable[i];
                
                if ticker._cancelled then
                    tremove(waitTable, i);
                    total = total - 1;
                elseif ticker._delay > elapsed then
                    ticker._delay = ticker._delay - elapsed;
                    i = i + 1;
                else
                    ticker._callback(ticker);
                    
                    if ticker._remainingIterations == -1 then
                        ticker._delay = ticker._duration;
                        i = i + 1;
                    elseif ticker._remainingIterations > 1 then
                        ticker._remainingIterations = ticker._remainingIterations - 1;
                        ticker._delay = ticker._duration;
                        i = i + 1;
                    elseif ticker._remainingIterations == 1 then
                        tremove(waitTable, i);
                        total = total - 1;
                    end
                end
            end
            
            if #waitTable == 0 then
                self:Hide();
            end
    end)
    
    local function AddDelayedCall(ticker, oldTicker)
        if oldTicker and type(oldTicker) == "table" then
            ticker = oldTicker;
        end
        
        tinsert(waitTable, ticker);
        waitFrame:Show();
    end
    
    _G.AddDelayedCall = AddDelayedCall;
    
    local function CreateTicker(duration, callback, iterations)
        local ticker = setmetatable({}, TickerMetatable);
        ticker._remainingIterations = iterations or -1;
        ticker._duration = duration;
        ticker._delay = duration;
        ticker._callback = callback;
        
        AddDelayedCall(ticker);
        
        return ticker;
    end
    
    function C_Timer.After(duration, callback)
        AddDelayedCall({
                _remainingIterations = 1,
                _delay = duration,
                _callback = callback
        });
    end
    
    function C_Timer.NewTimer(duration, callback)
        return CreateTicker(duration, callback, 1);
    end
    
    function C_Timer.NewTicker(duration, callback, iterations)
        return CreateTicker(duration, callback, iterations);
    end
    
    function TickerPrototype:Cancel()
        self._cancelled = true;
    end
end

local function A()
    print("第一个函数")
    C_Timer.After(2, function()
            print("第二个函数")
            C_Timer.After(2, function()
                    print("第三个函数")
            end)
    end)
end
A()


在魔蜂里运行还是只能打印一行
回复 支持 反对

使用道具 举报

发表于 2025-9-9 11:06:09 | 显示全部楼层
大佬不出来讲解下吗,浑身难受啊

点评

你想说什么,已经很详细了吧  详情 回复 发表于 2025-9-9 12:57 PM
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-9 12:57:47 | 显示全部楼层
xiaoyao1 发表于 2025-9-9 11:06 AM
大佬不出来讲解下吗,浑身难受啊

你想说什么,已经很详细了吧
回复 支持 反对

使用道具 举报

发表于 2025-9-13 00:52:58 | 显示全部楼层
感谢大佬无私分享,、
回复 支持 反对

使用道具 举报

发表于 2025-10-26 10:09:51 | 显示全部楼层
芝麻开门,原来,给我那题思路在这里,学习学习
回复 支持 反对

使用道具 举报

发表于 2025-11-6 13:56:46 | 显示全部楼层
看看内容
回复 支持 反对

使用道具 举报

发表于 2025-11-6 17:22:58 | 显示全部楼层
学习下,感觉平时也有能用到的地方
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|LUACN论坛

GMT+8, 2026-5-31 04:14 AM , Processed in 0.036329 second(s), 34 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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