北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 4799|回复: 7

请教一个协程得报错

[复制链接]
发表于 2015-2-27 12:44:04 | 显示全部楼层 |阅读模式
Run-time error
World: kingodg@sjsj
Function/Sub: wait_timer_resume called by timer
Reason: 正在处理定时器 "wait_timer_6223613"
[string "Script file"]:1409: coroutine exception
stack traceback:
        [C]: in function 'assert'
        [string "Script file"]:1409: in function <[string "Script file"]:1402>
脚本错误处的上下文:
1405 :
1406 :   local thread = wait_table[name]
1407 :
1408 :   if thread~=nil and thread~="" then
1409*:     assert(coroutine.resume (thread),"coroutine exception")
1410 :   --assert (coroutine.running (), "Must be in coroutine")
1411 :   else
1412 :     print(name," 不存在")
1413 :   end -- if

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-2-27 12:44:23 | 显示全部楼层
这个报错 该如何查找原因呢
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-2-27 19:32:48 | 显示全部楼层
coroutine有dead状态
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-3-2 12:52:04 | 显示全部楼层
coroutine有dead状态
cappuccino 发表于 2015-2-27 07:32 PM
请教 该怎么解决这个dead状态
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-3-2 13:08:37 | 显示全部楼层
呈上 三个函数

-- 线程表,储存正在暂停的线程
local wait_table = {}
--setmetatable(wait_table, {__mode = "k"}) --weak table
-- 被定时器调用以恢复一个暂停的线程
function wait_timer_resume(name)
  --print(table.getn(wait_table),"数组大小")
  --print("wait_id: ",name)

  local thread = wait_table[name]

  if thread~=nil and thread~="" then
    assert(coroutine.resume (thread),"coroutine exception")
         --assert (coroutine.running (), "Must be in coroutine")
  else
    print(name," 不存在")
  end -- if
  wait_table[name]=nil
  --collectgarbage()--垃圾回收
end -- function wait_timer_resume

-- 在脚本中调用这个函数来暂停当前的线程
function f_wait(address, seconds,ActiveWhenClosed)
  if seconds<=0 then
    address()
        return
  end
  id = "wait_timer_" .. GetUniqueNumber ()
  hours = math.floor(seconds / 3600)
  seconds = seconds - (hours * 3600)
  minutes = math.floor(seconds / 60)
  seconds = seconds - (minutes * 60)
  --print("等待",seconds,"s"," ",id)
  wait_table[id] =coroutine.create(function()
     --print("执行")
     address()
  end)
  if ActiveWhenClosed==true then
    status = AddTimer (id, hours, minutes, seconds, "",
            timer_flag.Enabled + timer_flag.OneShot +
            timer_flag.Temporary + timer_flag.Replace+timer_flag.ActiveWhenClosed,
            "wait_timer_resume")
  else
        status = AddTimer (id, hours, minutes, seconds, "",
            timer_flag.Enabled + timer_flag.OneShot +
            timer_flag.Temporary + timer_flag.Replace,
            "wait_timer_resume")
  end
  assert(status == error_code.eOK, error_desc[status])
end


function f_clear()
   for i,v in pairs(wait_table) do
      local thread=wait_table[i]
          if thread then
        wait_table[i]=nil
                --print(i)
            --print(coroutine.status(thread))
      end
   end
   wait_table={}
end
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-3-2 19:28:38 | 显示全部楼层
我的意思是

  if thread~=nil and thread~="" then
    assert(coroutine.resume (thread),"coroutine exception")
         --assert (coroutine.running (), "Must be in coroutine")
  else
    print(name," 不存在")
  end -- if
  wait_table[name]=nil
  --collectgarbage()--垃圾回收
end -- function wait_timer_resume

你这段代码里只判断了thread的两种情况,即空和非空。。而实际上dead协程是不会被系统自动清理的,所以如果thread已经dead,就会走非空的这个分支,而一个dead状态的thread是无法resume的,就会报错。。。

以上胡言乱语,不一定就是你出错的真正原因。。

俺对这些的了解也是一知半解而已。

flee
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-3-4 13:05:32 | 显示全部楼层
经过测试 好像不是dead协程
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-3-12 13:28:18 | 显示全部楼层
有高手可以答疑吗?谢谢了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-1 05:37 PM , Processed in 0.011296 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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