TC官方合作论坛

标题: 线程句柄一把幽黑、透明、不分敌我、杀人不见血的双刃剑 [打印本页]

作者: B哥    时间: 2013-5-20 13:00
标题: 线程句柄一把幽黑、透明、不分敌我、杀人不见血的双刃剑
     线程,其实我很讨厌,是相当讨厌,特别是在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
受教了........
作者: dengdaijihui    时间: 2013-5-20 14:32
小学毕业  全用英文的硬是以句没看懂 路过 ……
作者: 我是冰冻的番茄    时间: 2013-5-20 18:06
  B哥出品  必属精品
作者: alukaduo09    时间: 2013-5-20 21:18
在线程执行到功能结束的时候  在前面一行加入一个返回值 或者赋予一个变量一个数值,通过这两个办法来判断这个线程是否结束。

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




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1