TC官方合作论坛

 找回密码
 立即注册
查看: 1899|回复: 8

[问题] 多线程挂机挂久了,多线程无缘无故的会掉

[复制链接]
发表于 2017-3-8 10:27:17 | 显示全部楼层 |阅读模式

马上加入TC

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

x
本帖最后由 foxtail 于 2017-3-8 11:24 编辑

首先,容我说清楚问题。我的环境,TC 6.2 + WIN7 64位 + E3 16G
在多线程挂机挂久了,比如说1个小时、2个小时、3个小时之内,获取多线程状态,总会无状态,也就是掉了。

我代码里首先有3个线程,这3个线程里的过程是这样的

A线程为主线程(主线程做一些控制操作,比如读取账号、配置文件、界面值读取、绑定、句柄等工作,A线程的工作截止到绑定窗口为止,进入死循环卡变量值。然后打开B线程)
a线程核心代码.png


B线程的作用是(游戏启动到进入游戏结束,再开启C线程)
B线程.png



C线程为任务线程(做各个任务,比如主线什么的。在线程打开C的时候,首先就会执行关闭B线程,因为没有必要让它存在)
C任务线程.png






然后C线程任务完成之后,满足A线程卡死循环的因素,A跳出死循环,来到A线程第二阶段,代码继续往下执行,会执行换号的阶段。

换号阶段.png


在换号阶段里的“关闭线程再打开”函数里,我会把之前的C线程关闭,并将线程id数组赋值为0.然后再次开启c 线程循环的做任务
vvv.png

过程基本上就是这样,问题是:这些代码执行了1-3个小时之后,或者之内,窗口就会出现不动的现象,而且还在C线程执行任务的时候中间停掉的。也不是C线程任务的某个点。程序自身也并没有出现崩溃或者无响应~~~~~~

我的排错思路是这样的:我弄一个时钟控件,每2分钟执行一次,时钟控件里主要是查看一下线程的状态是否正常,然后就有了下面这个函数
时钟.png

3个小时后,我再去看。同样出现问题,某个窗口线程居然是无状态的。。。也就是线程掉了。不执行了。游戏角色的状态是在做任务的时候停掉的
线程异常.png



我想知道,为什么会出现这种多线程掉了的问题?现在问题可以解决,就是线程如果掉了,我重新开启,但是我搞不明白为什么会出现这种情况,线程在没有关闭的情况下自动关闭了。
论坛有人说是多线程BUG,请大神们来看一看。这问题差点搞得我要放弃TC了都。



回复

使用道具 举报

发表于 2017-3-9 19:21:54 来自手机 | 显示全部楼层
用三个线程,控制一个游戏窗口吗?
建议:把三线程合并为一个。每个线程控制一窗口。

当年我做热血江湖辅助,一线程控制一窗口,43线程控制43窗口,完全的很稳定,无BUG。
回复 支持 反对

使用道具 举报

发表于 2017-3-9 19:24:01 来自手机 | 显示全部楼层
不要用多个线程控制一个窗口。
这是浪费CPU运算核心的做法,
每个线程,都要占用一个运算核心的。
回复 支持 反对

使用道具 举报

发表于 2017-3-9 19:25:43 来自手机 | 显示全部楼层
tc。多线程这么卡。
.
码农-龙大: 17:05:11
tc多线程怎么这么卡??
//
剑仙十号: 17:26:19
多线程做30开,40开都很稳定呀。
你有没有
先做代码框架,一个线程对应一个窗口。
.
30个线程30窗口,40线程40窗口。
//
自由存在 - 正在输入: 17:27:34
多开必须代码构架好,不然还没有到就直接崩了
回复 支持 反对

使用道具 举报

发表于 2017-3-9 19:27:00 来自手机 | 显示全部楼层
tc简单开发吧,百度贴吧。
精品区。

tc简单开发。多线程技术1。
.
在tc1.0版以前,脚本执行的方式,都是单线程的。
单线程好比是公路上的单行道,脚本代码只能一条一条的执行,按顺序的执行。
而多线程,则提供了多车道。
多线程像公路上的行车道,超车道,单车道,人行道,多个脚本的代码,可以同时的执行,并排的执行。
………………
………………
在tc简单开发中,
线程是开启着的子函数,多线程,就是多个开启着的子函数!
(函数在tc中又叫功能)。
一子函数在一边放着,没有动,这样不能算做一个线程。
………………
………………
1、一个线程由BeginThread命令,和下面跟着的子函数组成。
例子:
线程ID = threadbegin("子函数", "")
//
功能 子函数()
//从这里开始你的代码
结束
(ajjl,易语言中的多线程,操作方法大同小异。)
………………
………………
2、使用threadbegin命令,一定要事先做好“全局变量”。tc中规定,写在功能外面的var 是“全局变量”。
var 线程ID0, 线程ID1, 线程ID2
功能 子函数0()
//从这里开始你的代码
结束
功能 子函数1()
//从这里开始你的代码
结束
功能 子函数2()
//从这里开始你的代码
结束
//
功能 启动_热键()
var ret = 线程获取状态(线程ID0)
if(ret == 假)
线程ID0 = 线程开启("子函数0", "")
线程ID1 = 线程开启("子函数1", "")
线程ID2 = 线程开启("子函数2", "")
end
结束
功能 终止_热键()
线程关闭(线程ID0)
线程关闭(线程ID1)
线程关闭(线程ID2)
结束
线程0,线程1,线程2这三台车,是同时在三条车道上运行着的。
………………
………………
3、多个线程,可以使用同一个子函数。
示例1:
var 线程ID0, 线程ID1, 线程ID2
功能 启动_热键()
var ret = 线程获取状态(线程ID0)
if(ret == 假)
线程ID0 = 线程开启("子函数", "0")
线程ID1 = 线程开启("子函数", "1")
线程ID2 = 线程开启("子函数", "2")
end
结束
功能 终止_热键()
线程关闭(线程ID0)
线程关闭(线程ID1)
线程关闭(线程ID2)
结束
功能 子函数(i)
while(1)
traceprint("线程" & i)
sleep(1000)
end
结束
//
//
示例2:商业辅助的写法。
1,用数组来保存 线程ID.
2,多个线程,使用同一个子函数.
var 线程ID = 数组()
功能 启动_热键()
var ret = 线程获取状态(线程ID[0])
if(ret == 假)
for(var i = 0; i < 3; i++)
线程ID[i] = 线程开启("子函数", i)
end
end
结束
功能 终止_热键()
for(var i = 0; i < 3; i++)
线程关闭(线程ID[i])
end
结束
功能 子函数(i)
while(1)
traceprint("线程" & i)
sleep(1000)
end
结束
………………
………………
4、在线程中,可以使用命令开启,关闭,暂停,恢复某一线程。
线程开启()
线程关闭()
线程暂停()
线程恢复()
参数1填的,都是线程ID。
//
多线程的优点:
脚本相互制约,相互作用,减少代码量。
………………
………………
5、线程开启() 的代码,禁止放入循环内。
如果线程开启() 放在循环内,循环着开启线程,
内存会被消耗干净,卡死电脑。严重的会烧坏CPU。
………………
………………
6、线程是占用 运算核心的。
一线程就是 一条生产线。
多线程就是 多条生产线。
现在的CPU,i3__双核4线程。i5__4核8线程。i7__8核8线程。
单核CPU在同一时间,只能照着2线程。多核心的,参考上面的文字说明。
在编写辅助时,必须减少线程的数量,提高线程的质量。
每1线程对应 1窗口,
43线程对应 43窗口。
.
mm198702:
这个和 取消勾选“禁止重复运行”,效果一样的吧?
.
卡特琳娜的旋转:
不一样。
在同一脚本中的多线程,可以共享数据的。
而多个脚本之间的线程,数据难以沟通共享。
回复 支持 反对

使用道具 举报

发表于 2017-3-9 19:27:36 来自手机 | 显示全部楼层
多线程技术2。
什么是单线程,双线程,多线程?
.
同时执行两个或者多个,叫多线程。
单线程,就比如你聊完QQ然后上贴吧。
双线程,就比如你可以同时聊QQ和上贴吧
.
再说得详细点,
同一个窗口,一个人干活和两个人干活的区别。
两个不同的窗口,一个人干活和两个人干活的区别。
//
//
单核心与多核心 CPU。
.
单核心,相当于一个"强人"在干活。
单核心双线程,一个“强人”干一项,二项任务,这样是可以的。
单核心多线程,一个“强人”干多项任务,会卡慢电脑。
多核心,则相当于是多了一个人,两个人干活,又势必比我一个“强人”快。
//
//
①单窗口单线程。
一条生产线,1个强人在干活。
②单窗口多线程。
一条生产线,2个强人在干活。
.
③多窗口多线程。
2条生产线,
每条生产线,都有1个强人在干活。
2条生产线,
每条生产线,都有2个强人在干活。
//
//
攒机。看配置请微信
计算机,单线程和双线程的差别到底是什么?
Andrew He
多线程相当于两条生产线,你发出的需求就是他们的任务,两条就可以并行处理两个任务。
.
不过我猜,可能问的没那么简单,
i3是双核4线程,i5是4核4线程,i7则是4核8线程,不知道题主是不是问这些中间的区别。
(同核心不同线程,同线程不同核心),就顺便简单引申一下吧。
.
线程是逻辑控制单元,而核心是真正独立的物理核心。
所以i3多线程,相当于是我是一个多任务强手,甚至于我比一般人多一只手,所以我处理多任务的时候会比一般人快。
但i5是多核心,则相当于是多了一个人,两个人干活,又势必比我一个“强人”快。
i7。i7原理和i3一样,就是比i3多了2个核,所以比i3多拥有4个线程。
//
//
追问(提问者):
也就是说,单核心 也拥有双线程?
双核单线的任务处理能力强于单核双线程?
.
Andrew He:
双核至少也有双线程,所以肯定强于单核双线程。
Andrew He:
也就是说一个核心,至少有一个线程,多出来的线程可以是 超线程技术或者其他技术。
但单核双线程,是比不上真正的双核双线程的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 21:12:35 | 显示全部楼层
剑仙十号 发表于 2017-3-9 19:21
用三个线程,控制一个游戏窗口吗?
建议:把三线程合并为一个。每个线程控制一窗口。

首先谢谢你回答,我是一个窗口对应一个线程的,开的线程是做任务,任务做完了切换回主线程,再循环关闭开启任务线程
回复 支持 反对

使用道具 举报

发表于 2017-3-9 22:35:37 | 显示全部楼层
线程死锁
回复

使用道具 举报

 楼主| 发表于 2017-3-9 22:49:44 | 显示全部楼层

哥,什么意思呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

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

GMT+8, 2024-9-28 16:52 , Processed in 0.050831 second(s), 26 queries .

Powered by 海安简单软件服务部

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

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