TC官方合作论坛

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

[讨论] 讨论一下TC多线程使用大漠或天使插件问题[已反馈问题结果]

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

马上加入TC

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

x
本帖最后由 perock 于 2013-12-10 15:48 编辑

小弟目前使用大漠+TC开发一游戏挂机,现有一点问题百思不得其解,外挂中使用三个线程:
线程1,负责监视血值变化,血值突然减少就立即使用随机,这个线程中主要是做ocr文字,然后判断血值,如果为真才会去按键,这个线程必须有。
线程2,用于监视地点和做一些挂机前的初始工作,比如修理装备,买材料等。这线程也是循环做判断,特定条件才会按键,也是必须的。
线程3,打怪与捡物品,这线程中就有频繁操作按键与鼠标,这个线程也是必须。

以上三线程中都使用大漠后台鼠标与键盘、找字、找图等功能。并且三个线程中使用一个大漠实例对象。
问题出来了,三个线程启动后,线程3打怪偶尔会停止运行(代码不执行了,没任何debug输出,不知何原因),这也只是偶尔出现,无固定时间,有时运行10分钟就停了,有时20分钟停了。
因目前tc并不能查询线程状态,所以只是推测线程是不是崩溃了。

看过大漠chm中讲过,多线程中键鼠可能冲突,所以我尽可能的减少了不同线程的键鼠操作,当心键鼠冲突引起线程停止。
我用了许多方法去测试了,包括怀疑是不是多线程键鼠操作冲突,插件bug,tc线程bug等,所以我尽量避免多线程操作鼠标键盘。
其实,以上三线程同时操作键鼠的机率不大,比如线程1不可能频繁去按键,因为被人杀也少遇到,所以线程1只会频繁去做ocr
线程2中与线程3也不会键鼠冲突,因为线程2只会在回城后执行一系列键鼠操作,而线程3中判断了当前地点是不是打怪地点,如果否就不会执行键鼠操作,如此,也不会出现键鼠冲突问题。

其次,怀疑大漠插件内部问题,造成tc线程崩溃而停止。这个没法测试,只能看看论坛朋友们有无遇到过。
最后,tc线程bug这个问题,估计不成立,因为tc仅仅调了winapi启动线程而已。


以前所述均在无逻辑问题前提下讨论的,比如线程未同步去修改某些数据啊,死循环啊,线程被其它线程暂停啊,都没有这样问题。

回复

使用道具 举报

25#
 楼主| 发表于 2013-12-10 15:47:33 | 只看该作者
分享一下问题解决方法:

1,不要轻易怀疑IDE与插件bug
2,这个偶尔引起线程假崩溃的凶手是
  1. if(新武尊辅助.获取当前地点() != "玛雅一层")
  2.        return 0
  3. endif
复制代码


这个代码看似没问题,实际上风险非常大,在做ocr时偶尔可能识别不正确,如此将会触发return 退出线程,造成无法察觉问题。
所以将安全起见 将 return 改成continue
回复 支持 反对

使用道具 举报

24#
发表于 2013-12-6 20:16:07 | 只看该作者
perock 发表于 2013-12-6 16:50
写成一个线程有以下问题:

在打怪或捡物品的时候,如果有人pk你,而此时代码尚未执行到查血处,那么在几 ...

不过写辅助技能有点复杂
毕竟辅助技能都几十分钟才使用一次
所以要用到系统.启动时间来判断
回复 支持 反对

使用道具 举报

23#
发表于 2013-12-6 20:12:10 | 只看该作者
perock 发表于 2013-12-6 16:50
写成一个线程有以下问题:

在打怪或捡物品的时候,如果有人pk你,而此时代码尚未执行到查血处,那么在几 ...

慢肯定慢点,0.00几秒吧.忽略不计吧
本来打怪的时候肯定要判断血蓝保护,打死怪后也要判断
是否有血蓝,没有就打坐回血蓝,在回血蓝种
被怪攻击,自动反击,反击完后后继续打坐回蓝血,
接着判断是否回城买卖,是否超出挂机范围,如果超出返回挂机点,
判断是否要加辅助技能,在捡起物品,最后在选怪,选中怪后判断是否是精英怪或者是BOSS,如果是
在根据设置判断换不换怪,如果不换,接着判断是否出现反外挂答题,有答题,然后判断血蓝,在打怪,打怪中
用完一个技能判断怪物死亡否,如果死直接后面技能就不用了直接换怪
我大多数写打怪都是这样
反正就是一个线程
打怪中要判断反外挂答题和血蓝保护,
打死怪后要判断辅助技能,是否会回城,是否超出挂机范围,是否血蓝保护,是否有血蓝,是否捡起
选怪是否精英或者BOSS
全部加清理判断0.3秒左右吧
反正忽略不计吧
回复 支持 反对

使用道具 举报

22#
发表于 2013-12-6 17:01:53 | 只看该作者
perock 发表于 2013-12-6 16:55
谢谢您能我发图,这个chm我看了,之前也曾使用多个实例去bind一个窗口,后来发现它与使用一个实例并无差 ...

并无差别??????

那你意思 大漠哥脑袋短路咯
回复 支持 反对

使用道具 举报

21#
 楼主| 发表于 2013-12-6 16:55:26 | 只看该作者
kaixindexifan 发表于 2013-12-6 10:20
并且三个线程中使用一个大漠实例对象。

谢谢您能我发图,这个chm我看了,之前也曾使用多个实例去bind一个窗口,后来发现它与使用一个实例并无差别,所以仍又改用一个实例了,不过在线程中尽量避免了同时操作键鼠。
回复 支持 反对

使用道具 举报

20#
 楼主| 发表于 2013-12-6 16:50:36 | 只看该作者
bocai7821 发表于 2013-12-6 14:25
写成一个线程吧
怎么简单的功能还要3个线程啊
改成一线程会简单很多

写成一个线程有以下问题:

在打怪或捡物品的时候,如果有人pk你,而此时代码尚未执行到查血处,那么在几秒中内就可能被人pk掉。

打怪与捡物过程有一系列判断与键鼠操作,另外还会有sleep,如果用一个线程,恐怕时刻要执行查血,如此,效率会很低。
回复 支持 反对

使用道具 举报

19#
发表于 2013-12-6 16:50:27 | 只看该作者
多线程序最容易出现这个情况了,当需要键鼠操作时,只保证有一个线程工作就OK了。
回复 支持 反对

使用道具 举报

18#
发表于 2013-12-6 14:25:21 | 只看该作者
写成一个线程吧
怎么简单的功能还要3个线程啊
改成一线程会简单很多
回复 支持 反对

使用道具 举报

17#
发表于 2013-12-6 10:20:46 | 只看该作者
perock 发表于 2013-12-6 00:25
线程3的while中有print,如果是此处死循环,那么while断点应有断下来,并且调试器应也能输出调试信息。但 ...

并且三个线程中使用一个大漠实例对象













本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

关闭

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

GMT+8, 2025-9-29 22:09 , Processed in 0.192560 second(s), 24 queries .

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

© 2001-2013 Comsenz Inc.

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