TC官方合作论坛

 找回密码
 立即注册
查看: 2764|回复: 10

[问题] 关于停止线程的疑问.

[复制链接]
发表于 2012-5-1 23:50:07 | 显示全部楼层 |阅读模式

马上加入TC

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

x
让我很蛋碎.我的情况是这样的.
  1.            thread.closethread(healH)
  2.           thread.closethread(startH)
复制代码


我设置了热键F10结束开启的线程.这样做是有效的.
然后我用同样的代码,复制到一个开启的线程当中,让它自己检测一个数据,数据变化之后运行停止代码.但是竟然是无效的.我使用弹窗查看.表示数据变化是正确的.动作是被执行了.但是这两句停止代码,似乎在线程当中是无效的..
然后我改用了调用函数进行结束,而且我调用的就是热键结束的函数.但是也是无效.用来检测的弹窗出现了.但是脚本继续执行..我很蛋碎呐.完全相当的函数,手动按F10就可以.但是在进程里面调用就不行.
求指点呐.如何让线程自动判断并停止呐..

回复

使用道具 举报

发表于 2012-5-1 23:54:36 | 显示全部楼层
回复 1楼4133789的帖子

亲!你的线程句柄设置为全局变量了没?
额,我错了,应该是全局了的,亲,能上多点代码么?
回复 支持 反对

使用道具 举报

发表于 2012-5-2 00:07:39 | 显示全部楼层
建议你把线程开启的代码以及测试关闭的代码都发出来,这样好帮你看问题。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-2 00:09:58 | 显示全部楼层
回复 1楼4133789的帖子

亲!你的线程句柄设置为全局变量了没?
额,我错了,应该是全局了的......
冷月无痕 发表于 2012-5-1 23:54:36

我去,这样不行呐,验证码一错误,打的字全没有了.真蛋碎.


表示好蛋碎呐.验证码错了.打的字全没有了.已经两次了.每次都打了很多....
表示我之前开启的 两个线程里面全部都有死循环.我现在改用 全局变量替换原来的死循环变量,然后 在线程里面修改全局变量来完成脚本的结束.这样做已经 成功了.
但是我的 问题还是没有解决呐.就是同样的代码,使用 F10调用可以.但是在线程里面调用就不行呢?(无论是两样的代码,还是F10的热键函数都不行)
我现在已经付上的全部源码,现在已经改了全局变量来进行结束了.不过请看看,应该是我写的有问题.表示如果 同样的结束代码,在线程当中不能被很好的执行的话, 那就太蛋碎了.

  1. namespace sb
  2. //定义默认空间
  3. int healH,startH,start_while_I,heal_while_i
  4. //start_while_I=0
  5. //heal_while_i=0
  6. function int  heal(string param)
  7. int hwnd,x,y
  8.    string caption
  9.    bool ifok
  10.    while (heal_while_i==0)
  11.      hwnd=window.getactivewindowhwnd()  
  12.    caption=window.getwindowcaption(hwnd)   
  13.   ifok=color.findrectpixelcolor(125,50 ,125+1,50+1,#1C28FF,0,x,y)
  14.    if (ifok)
  15.    else
  16.        drivekeyboard.keypress(48,1)
  17.    endif
  18.       if (caption != "游戏")
  19.           // help.messagebox(caption)
  20.            //sb.hotkey1_onhotkey()
  21.            
  22.            start_while_I=1
  23.            heal_while_i=1
  24.           //thread.closethread(healH)
  25.           //thread.closethread(startH)
  26.           help.messagebox("你已经离开了游戏,所以不再运行程序了.")
  27.           //help.exit()
  28.    endif
  29.    help.sleep(500)
  30.    endwhile
  31. return 0
  32. endfunction

  33. function bool start()
  34. //这里添加你要执行的代码

  35. int[] AbilityLoop=int[11] //TC里面
  36. AbilityLoop[1]=        49
  37. AbilityLoop[2]=        50
  38. AbilityLoop[3]=        51
  39. AbilityLoop[4]=        52
  40. AbilityLoop[5]=        53
  41. AbilityLoop[6]=        54
  42. AbilityLoop[7]=        55
  43. AbilityLoop[8]=        56
  44. AbilityLoop[9]=        57
  45. AbilityLoop[10]=        48
  46. int AbilitySmall = convert.strtoint(edit.gettext("edit0"),0)
  47. int AbilityBig =convert.strtoint(edit.gettext("edit1"),0)
  48. if (AbilityBig>10)
  49.     help.messagebox("你疯了,不拿程序妹子当回事呐!\n现在最大值只劫持到9,你哪有那么多技能需要放呐!\n再填写超过9,小心我让你自动关机呐.")
  50.     AbilityBig = 100
  51. endif
  52. if (AbilityBig==0)
  53.     help.messagebox("你疯了,不拿程序妹子当回事呐!\n写0也不行!\n再填写0,小心我让你自动关机呐.")
  54.     AbilityBig = 100
  55. endif
  56. if (AbilityBig==AbilitySmall)
  57.     help.messagebox("你疯了,不拿程序妹子当回事呐!\n两个技能键不能是同一个,你只放一个技能呐.脑残!\n再填写一样,小心我让你自动关机呐.")
  58.     AbilityBig = 100
  59.    
  60. endif

  61. if (AbilityBig==100)
  62.     //等于100时属于情况蛋碎,所以什么也不执行.
  63. else

  64.   // stopH=thread.beginthread("sb.stop","1")
  65. int color,x,y,Ability_12
  66.    int AbilityX= AbilityBig-AbilitySmall
  67.    int AbilityI = 0
  68.    bool pickup=false

  69. while (start_while_I==0)

  70.    bool ifok=color.findrectpixelcolor(121,53,121+1,53+1,#3C6374,0,x,y)
  71. if(ifok)
  72.    //help.messagebox("找到该颜色,坐标值为:"+convert.inttostr(x)+"   "+convert.inttostr(y))

  73.       pickup=true
  74.        drivekeyboard.keypress(AbilityLoop[AbilitySmall+AbilityI],1)   
  75.        AbilityI=AbilityI+1
  76.       
  77.        if (AbilityI>AbilityX)
  78.            AbilityI=0
  79.        endif
  80.       

  81. else
  82.     //help.messagebox("你当前没有选怪吧")
  83.         drivekeyboard.keypress (90,1)
  84.         if (pickup==true)
  85.             drivekeyboard.keypress(32,1)
  86.             help.sleep(100)
  87.             drivekeyboard.keypress(32,1)
  88.              help.sleep(100)
  89.             drivekeyboard.keypress(32,1)
  90.               help.sleep(100)
  91.             drivekeyboard.keypress(32,1)
  92.         endif
  93.          
  94. endif
  95.    help.sleep(1500)
  96.    
  97. endwhile

  98.    
  99. endif


  100. return true
  101. //函数返回语句
  102. endfunction



  103. function bool hotkey1_onhotkey()
  104. //这里添加你要执行的代码
  105. help.messagebox("我要退出了")
  106.           // help.messagebox(convert.inttostr(healH))
  107.            // help.messagebox(convert.inttostr(startH))
  108.             
  109. thread.closethread(healH)
  110. thread.closethread(startH)

  111. return true
  112. endfunction


  113. function bool hotkey0_onhotkey()
  114. //这里添加你要执行的代码
  115. int name
  116. string wowname

  117. name=window.findwindow("CABAL")
  118. //help.messagebox(convert.inttostr(name))
  119. //name=330886
  120. if(name==0)
  121.     help.messagebox("窗口没有找到")
  122. else
  123. //help.messagebox("寻找到后的"+convert.inttostr(name))
  124.     window.setwindowpos(name,0,0) //Move To Window of 0,0
  125.     window.activate(name) //Activate
  126. endif
  127. //help.messagebox(convert.inttostr(start_while_I))
  128. //help.messagebox(convert.inttostr(heal_while_i))
  129. heal_while_i=0
  130. start_while_I=0
  131. startH=thread.beginthread("sb.start","")
  132. help.sleep(1000)
  133. healH=thread.beginthread("sb.heal","")

  134. return true
  135. endfunction

  136. endnamespace
  137. //空间结束语句
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-2 00:15:23 | 显示全部楼层
回复 3楼Abin的帖子

已经附上了源码.请版主看看.
回复 支持 反对

使用道具 举报

发表于 2012-5-2 00:45:23 | 显示全部楼层
看了一遍,比较迷糊了。。 自己写了个简单的测试了下。 你看看我这里和你的像不?
  1. 空间 测试TTT
  2. int handle1,handle2
  3. 功能 逻辑型 ceshi1()
  4. while(true)
  5.     help.sleep(1000)
  6.     help.messagebox("i am thread one!")   
  7. endwhile
  8. 返回 真
  9. 功能结束
  10. 功能 逻辑型 ceshi2()
  11.     help.messagebox("i am close threader!")
  12.     thread.closethread(handle1)
  13.     thread.closethread(handle2)
  14. 返回 真
  15. 功能结束
  16. 功能 逻辑型 开始_点击()
  17. handle1 = thread.beginthread("测试TTT.ceshi1","")
  18. handle2 = thread.beginthread("测试TTT.ceshi2","")
  19. 返回 真
  20. 功能结束
  21. 功能 逻辑型 退出_点击()
  22. 辅助.退出()
  23. 返回 真
  24. 功能结束
  25. 空间结束
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-5-2 00:54:39 | 显示全部楼层
回复 5楼4133789的帖子

线程已经停止了的,help.messagebox("你已经离开了游戏,所以不再运行程序了.")
这一条代码因为线程停止了 所以不执行了
用函数调用也可以停(自从用了TC看英文蛋疼)
  1. 空间 测试2
  2. 整型 线程句柄,线程句柄1,线程句柄2
  3. 功能 整型 我是线程一()
  4. 循环(真)
  5. 辅助.等待(2000)
  6. 循环结束
  7. 返回 0
  8. 功能结束
  9. 功能 整型 我是线程二()
  10. 循环(真)
  11. 辅助.等待(2000)
  12. 循环结束
  13. 返回 0
  14. 功能结束
  15. 功能 整型 我是线程三()
  16. 整型 a
  17. 循环(a<3)
  18. 辅助.等待(2000)
  19. a=a+1
  20. 循环结束
  21. 辅助.消息框("线程要停止了")
  22. 测试2.退出_点击()
  23. 返回 0
  24. 功能结束
  25. 功能 逻辑型 开始_点击()
  26. 线程句柄=线程.开启("测试2.我是线程一","")
  27. 线程句柄1=线程.开启("测试2.我是线程二","")
  28. 线程句柄2=线程.开启("测试2.我是线程三","")
  29. 返回 真
  30. 功能结束
  31. 功能 逻辑型 退出_点击()
  32. 辅助.消息框("线程停止了")
  33. 线程.关闭(线程句柄)
  34. 线程.关闭(线程句柄1)
  35. 线程.关闭(线程句柄2)
  36. 辅助.退出()
  37. 返回 真
  38. 功能结束
  39. 空间结束
复制代码

调用函数的话只可以停线程,但是不能退出,同理,因为线程已经销毁了!
回复 支持 反对

使用道具 举报

发表于 2012-5-2 09:09:49 | 显示全部楼层
楼主很荣幸哦!!高人给你解析!!!
回复 支持 反对

使用道具 举报

发表于 2012-5-2 09:11:14 | 显示全部楼层
在线程里调用消毁自身的函数是可以的,然后再在退出脚本。help.exit(),记得一旦调用消毁自身的函数后边
的所有语句都不会执行。如果有需要结束化的语句一定要先执行。例如:解除窗口绑定等,初始化全局变量等,全局变量是静态的,不然会保存上次调用的结果。
回复 支持 反对

使用道具 举报

发表于 2012-5-2 09:20:30 | 显示全部楼层
:D  我也来看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

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

GMT+8, 2024-9-30 08:47 , Processed in 0.041243 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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