「脚本通用模板」app卡屏后,通过多线程“重启”脚本
大家好,我是公号3分钟学堂的郭立员,本期讲一下“「脚本通用模板」app卡屏后,通过多线程“重启”脚本”,在文章标题上我给重启两个字加上了引号,因为本期内容讲的并不是直接重启脚本,而是重启多线程中的一个子线程。
在写多线程的时候,我本着一个原则:线程越少越好。这次的话我用了双线程完成想要的功能。
一个主线程和一个子线程:
主线程:循环检测屏幕是否发生变化
子线程:完成脚本要实现的具体功能(脚本干啥用的)
先说一下主线程的思路:
①在屏幕上截取指定区域(范围)的一个截图
②设置你要作为检测卡顿的时间,比如1分钟画面不发生变化,即认为是卡屏了
③通过找图命令在步骤①的范围内找那张截图,如果找到了说明屏幕没变化,也就是卡屏了,反之则认为没有卡屏。
④循环执行上面三步,循环不要太频繁,可以设置多久执行一次。
关于子程序没啥说的,根据自己的脚本内容正常去写就行。
下面根据源码,我们说一下注意的细节。
①启动子线程要赋值给一个变量。
dim h=Thread.Start(主程序)
这个是因为停止子线程的时候,你需要明确的告诉脚本,它要停止哪一个在运行的子线程。
Thread.Stop (h)
②同一个函数,如果执行两次启动子线程命令,会有两个线程同时执行。
Thread.Start(主程序)Thread.Start(主程序)
就比如这样,脚本是会有两个主线程同时运行,通常我们可能会认为一个子线程只能有一个在运行,这是一个误区。
③基于上一点的原因,我们重启子线程要先停止正常运行的子线程,然后在开始启动新的线程。这里面有个细节就是我用同一个变量h来存储子线程启动,这样我在写停止线程的时候,就可以统一写成:
Thread.Stop (h)
④启动子线程的时候代码中,子线程名称后面不能有括号
Thread.Start(主程序) //正确写法
Thread.Start(主程序()) //错误写法
这种没参数的情况还好说,如果有参数,写法的区别就更加明显了
Thread.Start(主程序(参数1,参数2)) //错误写法
Thread.Start(主程序,参数1,参数2) //正确写法
⑤关于子线程的写法注意事项,在我的代码中叫“主程序”,可以理解为主要的功能程序,本质上说它是一个自定义的函数,对于函数内变量它是局部变量,只在函数内部有效。
很多网友喜欢写大量的自定义函数,本身不能写在子线程内部,只能是调用函数,这里调用的时候一定要注意了,平时调用函数可以写的随意些:
call 函数
call 函数()
函数
函数()
这几种写法都是对的,但是作为子线程内部调用的时候,必须要写上括号。如果需要把返回值复制给变量,不能用call。
好了本期内容就这些。