TC官方合作论坛
标题:
线程句柄一把幽黑、透明、不分敌我、杀人不见血的双刃剑
[打印本页]
作者:
B哥
时间:
2013-5-20 13:00
标题:
线程句柄一把幽黑、透明、不分敌我、杀人不见血的双刃剑
线程,其实我很讨厌,是相当讨厌,特别是在TC V4.048 出来之前。因为4.048有了。神奇特别的"调试输出()" 这个调试打印命令后。。线程才方便一点调试。。。不说线程占CPU吧。。就说之间产生一些怪异BUG很难找。我上一个脚本。就因为一些频繁的线程操作。产生的问题。找了一周硬是没找出问题来。最后放弃了。。。换成了单线程。 我犯贱...这个脚本。我又从单线程改成了。多线程。但不可否认线程。在处理各种没规律的突发事件还是很好用的。。如:出现验证码,网络断线检测,检测脚本是否被一些任务卡死等。用起来还是蛮爽的!
爽了后,一不小心就有可能怀孕呀!!!后果很严重。。这次我又被折腾了好几天。昨天晚上又是一个通宵!
进入正题吧: 线程句柄
是的就这个句柄。在我个人理解。他应该基本是一个唯一的一个值。用这个句柄值来操作线程
如关闭、暂时、恢复等操作的钥匙。。。我还一直以为一个钥匙就插一个洞,只能开一把锁。
就是这个样法。。。我用线程句柄。。做了一个唯一的KEY值。简单的就是把这个句柄存数组中。可拿到线程。同样还做了一些其它业务值的映射。。。可结果。数组中的用线程句柄做KEY的缓存数据。被重复操作和调用。。因为这个KEY(线程句柄。。就是一个可重复的。)
上一段测试代码吧。
1.线程被开启一直在操作的情况下。
function start_click()
for(i=0;i<3;i++)
th=thread.beginthread("ThreadTest.run",i)
调试输出("thread handle:"&th&" start index:"&i)
help.sleep(1000)
endfor
endfunction
function run(pram)
调试输出("run index:"&pram&" thread:"&thread.getcurrenthandle())
while(true)
help.sleep(500)
endwhile
endfunction
复制代码
结果:
"thread handle:1676 start index:0"
"run index:0 thread:1676"
"thread handle:1680 start index:1"
"run index:1 thread:1680"
"thread handle:1684 start index:2"
"run index:2 thread:1684"
复制代码
2.线程被开启后,有可能被关闭或自然死亡。
function start_click()
for(i=0;i<3;i++)
th=thread.beginthread("ThreadTest.run",i)
调试输出("thread handle:"&th&" start index:"&i)
help.sleep(1000)
endfor
endfunction
function run(pram)
调试输出("run index:"&pram&" thread:"&thread.getcurrenthandle())
endfunction
复制代码
结果:
"thread handle:1676 start index:0"
"run index:0 thread:1676"
"thread handle:1692 start index:1"
"run index:1 thread:1692"
"thread handle:1676 start index:2"
"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