TC官方合作论坛

 找回密码
 立即注册
查看: 580|回复: 4
打印 上一主题 下一主题

[讨论] 线程句柄一把幽黑、透明、不分敌我、杀人不见血的双刃剑

[复制链接]
跳转到指定楼层
楼主
发表于 2013-5-20 13:00:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
     线程,其实我很讨厌,是相当讨厌,特别是在TC V4.048 出来之前。因为4.048有了。神奇特别的"调试输出()" 这个调试打印命令后。。线程才方便一点调试。。。不说线程占CPU吧。。就说之间产生一些怪异BUG很难找。我上一个脚本。就因为一些频繁的线程操作。产生的问题。找了一周硬是没找出问题来。最后放弃了。。。换成了单线程。        我犯贱...这个脚本。我又从单线程改成了。多线程。但不可否认线程。在处理各种没规律的突发事件还是很好用的。。如:出现验证码,网络断线检测,检测脚本是否被一些任务卡死等。用起来还是蛮爽的!
     爽了后,一不小心就有可能怀孕呀!!!后果很严重。。这次我又被折腾了好几天。昨天晚上又是一个通宵!

        进入正题吧:     线程句柄  
           是的就这个句柄。在我个人理解。他应该基本是一个唯一的一个值。用这个句柄值来操作线程
                    如关闭、暂时、恢复等操作的钥匙。。。我还一直以为一个钥匙就插一个洞,只能开一把锁。
       就是这个样法。。。我用线程句柄。。做了一个唯一的KEY值。简单的就是把这个句柄存数组中。可拿到线程。同样还做了一些其它业务值的映射。。。可结果。数组中的用线程句柄做KEY的缓存数据。被重复操作和调用。。因为这个KEY(线程句柄。。就是一个可重复的。)
         上一段测试代码吧。
   1.线程被开启一直在操作的情况下。

  1. function start_click()
  2.     for(i=0;i<3;i++)
  3.         th=thread.beginthread("ThreadTest.run",i)
  4.         调试输出("thread handle:"&th&"   start index:"&i)
  5.         help.sleep(1000)
  6.     endfor
  7. endfunction

  8. function run(pram)
  9.     调试输出("run index:"&pram&"  thread:"&thread.getcurrenthandle())
  10.     while(true)
  11.         help.sleep(500)
  12.     endwhile
  13. endfunction
复制代码
结果:
  1. "thread handle:1676   start index:0"
  2. "run index:0  thread:1676"
  3. "thread handle:1680   start index:1"
  4. "run index:1  thread:1680"
  5. "thread handle:1684   start index:2"
  6. "run index:2  thread:1684"
复制代码


2.线程被开启后,有可能被关闭或自然死亡。

  1. function start_click()
  2.     for(i=0;i<3;i++)
  3.         th=thread.beginthread("ThreadTest.run",i)
  4.         调试输出("thread handle:"&th&"   start index:"&i)
  5.         help.sleep(1000)
  6.     endfor
  7. endfunction

  8. function run(pram)
  9.     调试输出("run index:"&pram&"  thread:"&thread.getcurrenthandle())
  10. endfunction
复制代码


结果:
  1. "thread handle:1676   start index:0"
  2. "run index:0  thread:1676"
  3. "thread handle:1692   start index:1"
  4. "run index:1  thread:1692"
  5. "thread handle:1676   start index:2"
  6. "run index:2  thread:1676"
复制代码
     仔细看看。就会发现。第种情况。。 1676 句柄。被重复分配给多条线程。

  总结:在缓存数据时,不能当单独拿线程句柄其它业务操作。还有就是。像一些线程关闭操作。也不要多次重复操作。因为这个句柄。。有可能代表是一个新线程。(因为有可能你前哪个线程死了。你现在操作的。这个句柄是一个新线程)。。。
          我血淋淋的教训呀。希望我的这些经验能让一些其它的童鞋遇到同样的问题。得到一些帮助!
回复

使用道具 举报

沙发
发表于 2013-5-20 13:08:23 | 只看该作者
受教了........
回复 支持 反对

使用道具 举报

板凳
发表于 2013-5-20 14:32:17 | 只看该作者
小学毕业  全用英文的硬是以句没看懂 路过 ……
回复 支持 反对

使用道具 举报

地板
发表于 2013-5-20 18:06:32 | 只看该作者
  B哥出品  必属精品
回复 支持 反对

使用道具 举报

5#
发表于 2013-5-20 21:18:36 | 只看该作者
在线程执行到功能结束的时候  在前面一行加入一个返回值 或者赋予一个变量一个数值,通过这两个办法来判断这个线程是否结束。

总的来说一切BUG的解决方案就是不断的调试。调试代码也是一个学习的好办法
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18043773号

GMT+8, 2025-10-4 12:04 , Processed in 0.125670 second(s), 23 queries .

Powered by 海安天坑软件科技有限公司

© 2001-2013 Comsenz Inc.

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