TC官方合作论坛
标题:
关于停止线程的疑问.
[打印本页]
作者:
4133789
时间:
2012-5-1 23:50
标题:
关于停止线程的疑问.
让我很蛋碎.我的情况是这样的.
thread.closethread(healH)
thread.closethread(startH)
复制代码
我设置了
热键F10结束
开启的线程.这样做
是有效的
.
然后我用
同样的代码
,
复制到一个开启的线程当中,让它自己检测一个数据
,数据变化
之后
运行停止代码
.但是竟然是
无效
的.我
使用弹窗查看
.表示
数据变化是正确的.动作是被执行了.
但是
这两句停止代码,似乎在
线程
当中是无效的
..
然后我改用了
调用函数
进行结束
,而且我调用的就
是热键结束的函数
.但是也是无效.用来检测的弹窗出现了.但是脚本继续执行..我很蛋碎呐.完全相当的函数,手动按F10就可以.但是在进程里面调用就不行.
求指点呐.如何让线程自动判断并停止呐..
作者:
冷月无痕
时间:
2012-5-1 23:54
回复
1楼
4133789
的帖子
亲!你的线程句柄设置为全局变量了没?
额,我错了,应该是全局了的,亲,能上多点代码么?
作者:
Abin
时间:
2012-5-2 00:07
建议你把线程开启的代码以及测试关闭的代码都发出来,这样好帮你看问题。。
作者:
4133789
时间:
2012-5-2 00:09
回复
1楼
4133789
的帖子
亲!你的线程句柄设置为全局变量了没?
额,我错了,应该是全局了的......
冷月无痕 发表于 2012-5-1 23:54:36
我去,这样不行呐,验证码一错误,打的字全没有了.真蛋碎.
表示好蛋碎呐.验证码错了.打的字全没有了.已经两次了.每次都打了很多....
表示我之前开启的
两个线程里面全部都有死循环
.我现在改用
全局变量
替换原来的死循环变量,然后
在线程里面修改全局变量
来完成脚本的结束.这样做已经
成功
了.
但是我的
问题还是没有解决
呐.就是同样的代码,使用
F10调用可以.但是在线程里面调用就不行
呢?(无论是两样的代码,还是F10的热键函数都不行)
我现在已经付上的全部源码,现在已经改了全局变量来进行结束了.不过请看看,应该是我写的有问题.表示如果
同样的结束代码,在线程当中不能被很好的执行的话,
那就太蛋碎了.
namespace sb
//定义默认空间
int healH,startH,start_while_I,heal_while_i
//start_while_I=0
//heal_while_i=0
function int heal(string param)
int hwnd,x,y
string caption
bool ifok
while (heal_while_i==0)
hwnd=window.getactivewindowhwnd()
caption=window.getwindowcaption(hwnd)
ifok=color.findrectpixelcolor(125,50 ,125+1,50+1,#1C28FF,0,x,y)
if (ifok)
else
drivekeyboard.keypress(48,1)
endif
if (caption != "游戏")
// help.messagebox(caption)
//sb.hotkey1_onhotkey()
start_while_I=1
heal_while_i=1
//thread.closethread(healH)
//thread.closethread(startH)
help.messagebox("你已经离开了游戏,所以不再运行程序了.")
//help.exit()
endif
help.sleep(500)
endwhile
return 0
endfunction
function bool start()
//这里添加你要执行的代码
int[] AbilityLoop=int[11] //TC里面
AbilityLoop[1]= 49
AbilityLoop[2]= 50
AbilityLoop[3]= 51
AbilityLoop[4]= 52
AbilityLoop[5]= 53
AbilityLoop[6]= 54
AbilityLoop[7]= 55
AbilityLoop[8]= 56
AbilityLoop[9]= 57
AbilityLoop[10]= 48
int AbilitySmall = convert.strtoint(edit.gettext("edit0"),0)
int AbilityBig =convert.strtoint(edit.gettext("edit1"),0)
if (AbilityBig>10)
help.messagebox("你疯了,不拿程序妹子当回事呐!\n现在最大值只劫持到9,你哪有那么多技能需要放呐!\n再填写超过9,小心我让你自动关机呐.")
AbilityBig = 100
endif
if (AbilityBig==0)
help.messagebox("你疯了,不拿程序妹子当回事呐!\n写0也不行!\n再填写0,小心我让你自动关机呐.")
AbilityBig = 100
endif
if (AbilityBig==AbilitySmall)
help.messagebox("你疯了,不拿程序妹子当回事呐!\n两个技能键不能是同一个,你只放一个技能呐.脑残!\n再填写一样,小心我让你自动关机呐.")
AbilityBig = 100
endif
if (AbilityBig==100)
//等于100时属于情况蛋碎,所以什么也不执行.
else
// stopH=thread.beginthread("sb.stop","1")
int color,x,y,Ability_12
int AbilityX= AbilityBig-AbilitySmall
int AbilityI = 0
bool pickup=false
while (start_while_I==0)
bool ifok=color.findrectpixelcolor(121,53,121+1,53+1,#3C6374,0,x,y)
if(ifok)
//help.messagebox("找到该颜色,坐标值为:"+convert.inttostr(x)+" "+convert.inttostr(y))
pickup=true
drivekeyboard.keypress(AbilityLoop[AbilitySmall+AbilityI],1)
AbilityI=AbilityI+1
if (AbilityI>AbilityX)
AbilityI=0
endif
else
//help.messagebox("你当前没有选怪吧")
drivekeyboard.keypress (90,1)
if (pickup==true)
drivekeyboard.keypress(32,1)
help.sleep(100)
drivekeyboard.keypress(32,1)
help.sleep(100)
drivekeyboard.keypress(32,1)
help.sleep(100)
drivekeyboard.keypress(32,1)
endif
endif
help.sleep(1500)
endwhile
endif
return true
//函数返回语句
endfunction
function bool hotkey1_onhotkey()
//这里添加你要执行的代码
help.messagebox("我要退出了")
// help.messagebox(convert.inttostr(healH))
// help.messagebox(convert.inttostr(startH))
thread.closethread(healH)
thread.closethread(startH)
return true
endfunction
function bool hotkey0_onhotkey()
//这里添加你要执行的代码
int name
string wowname
name=window.findwindow("CABAL")
//help.messagebox(convert.inttostr(name))
//name=330886
if(name==0)
help.messagebox("窗口没有找到")
else
//help.messagebox("寻找到后的"+convert.inttostr(name))
window.setwindowpos(name,0,0) //Move To Window of 0,0
window.activate(name) //Activate
endif
//help.messagebox(convert.inttostr(start_while_I))
//help.messagebox(convert.inttostr(heal_while_i))
heal_while_i=0
start_while_I=0
startH=thread.beginthread("sb.start","")
help.sleep(1000)
healH=thread.beginthread("sb.heal","")
return true
endfunction
endnamespace
//空间结束语句
复制代码
作者:
4133789
时间:
2012-5-2 00:15
回复
3楼
Abin
的帖子
已经附上了源码.请版主看看.
作者:
Abin
时间:
2012-5-2 00:45
看了一遍,比较迷糊了。。 自己写了个简单的测试了下。 你看看我这里和你的像不?
空间 测试TTT
int handle1,handle2
功能 逻辑型 ceshi1()
while(true)
help.sleep(1000)
help.messagebox("i am thread one!")
endwhile
返回 真
功能结束
功能 逻辑型 ceshi2()
help.messagebox("i am close threader!")
thread.closethread(handle1)
thread.closethread(handle2)
返回 真
功能结束
功能 逻辑型 开始_点击()
handle1 = thread.beginthread("测试TTT.ceshi1","")
handle2 = thread.beginthread("测试TTT.ceshi2","")
返回 真
功能结束
功能 逻辑型 退出_点击()
辅助.退出()
返回 真
功能结束
空间结束
复制代码
作者:
冷月无痕
时间:
2012-5-2 00:54
回复
5楼
4133789
的帖子
线程已经停止了的,help.messagebox("你已经离开了游戏,所以不再运行程序了.")
这一条代码因为线程停止了 所以不执行了
用函数调用也可以停(自从用了TC看英文蛋疼)
空间 测试2
整型 线程句柄,线程句柄1,线程句柄2
功能 整型 我是线程一()
循环(真)
辅助.等待(2000)
循环结束
返回 0
功能结束
功能 整型 我是线程二()
循环(真)
辅助.等待(2000)
循环结束
返回 0
功能结束
功能 整型 我是线程三()
整型 a
循环(a<3)
辅助.等待(2000)
a=a+1
循环结束
辅助.消息框("线程要停止了")
测试2.退出_点击()
返回 0
功能结束
功能 逻辑型 开始_点击()
线程句柄=线程.开启("测试2.我是线程一","")
线程句柄1=线程.开启("测试2.我是线程二","")
线程句柄2=线程.开启("测试2.我是线程三","")
返回 真
功能结束
功能 逻辑型 退出_点击()
辅助.消息框("线程停止了")
线程.关闭(线程句柄)
线程.关闭(线程句柄1)
线程.关闭(线程句柄2)
辅助.退出()
返回 真
功能结束
空间结束
复制代码
调用函数的话只可以停线程,但是不能退出,同理,因为线程已经销毁了!
作者:
dzh
时间:
2012-5-2 09:09
楼主很荣幸哦!!高人给你解析!!!
作者:
xuhekkll
时间:
2012-5-2 09:11
在线程里调用消毁自身的函数是可以的,然后再在退出脚本。help.exit(),记得一旦调用消毁自身的函数后边
的所有语句都不会执行。如果有需要结束化的语句一定要先执行。例如:解除窗口绑定等,初始化全局变量等,全局变量是静态的,不然会保存上次调用的结果。
作者:
tyuyan
时间:
2012-5-2 09:20
:D 我也来看看
作者:
花开花落
时间:
2012-5-2 09:48
来学习学习!
欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/)
Powered by Discuz! X3.1