按键精灵

「脚本通用模板」app卡屏后,通过多线程“重启”脚本

2020-06-03  本文已影响0人  3分钟学堂郭立员

大家好,我是公号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。

好了本期内容就这些。

上一篇 下一篇

猜你喜欢

热点阅读