如何获得lua脚本的执行百分比?

时间:2013-12-06 22:51:29

标签: c lua

我在一个单独的任务中在c应用程序中运行Lua脚本,我添加了一个功能来检查正在运行的脚本的状态,如果它仍在运行或已完成。

我想在运行脚本的情况下添加一些信息,我想添加从正在运行的脚本执行的百分比,Lua是否支持此信息。

我尝试使用Lua_debug中报告的信息,但它看起来不正确(如currentlin,definedline),我需要整个脚本的百分比,而不仅仅是特定的功能。

1 个答案:

答案 0 :(得分:1)

你可以设置debug hook并听取钩子事件:

Ideone

local script = [[
    print 'hello'
    print 'world'
    for i=0,3 do
        local answer = 42
    end
]]

local script_function = loadstring(script)

local function count_lines ()
    local count = 0
    for k,v in script:gmatch '\n' do count = count+1 end
    return count
end

local function trace(total_lines)
    local max_last_line = 0
    return function(info,line_number)
        if line_number > max_last_line then
            print(tostring(line_number/total_lines*100)..'%')
            max_last_line = line_number
        end
    end
end

local lines = count_lines()

local thread = coroutine.create( script_function )

debug.sethook(thread, trace(lines), "l")
coroutine.resume(thread)

输出:

20%
hello
40%
world
60%
80%
100%

然而,值得一提的是,从这样的进度报告中获取有意义的数字仍然非常困难 - 如果您组织代码并且最后的唯一声明是对某种主要内容的调用,则进度将为100 %,而数字不代表任何有用的。您还可以跟踪线条并测量覆盖率,但自然地,100%覆盖率不是您在执行运行期间通常拥有的。您还可以尝试构建用于进度报告的系统并调用类似

的函数
ReportProgress( tasks / all_tasks )

将绑定到C并生成必要的进度更新