3个回答
展开全部
「按键精灵安卓版」关于“多线程”的理解
我平时写脚本基本上是不用多线程的,一是我写长期运行的脚本不多,没有多线程的需求,二是多线程容易造成脚本卡顿。
当然我不用不代表别人也不用,最近就看到群里有一些朋友在问关于多线程的问题,确实对于新手朋友来说容易出问题。
下面就说一下我对于多线程的一些理解:
(一)什么是主线程、什么是子线程
先说一个误区:相信很多新手朋友会觉得主线程是这样的:
Function 主程序()
//这里面是我的脚本主要的功能操作
End Function
这明显是错误的,在多线程脚本中,区分主线程的方法是看它是不是不在function或者sub内部,只要没在函数内部的就是主线程。至于说取个主程序或者主线程这类名字,和它是不是主线程没有一点关系。
上面说的是主线程,再来说说子线程是什么?
只要用Thread.Start启动的都是子线程。比如:
Thread.Start 主程序
Function 主程序()
//这里面是我的脚本主要的功能操作
End Function
当然没有启动的函数就不算了。
(二)子线程可以有多少个?
从语告银唯法角度来说没有限制,你写多少个都可以,但是实际应用中基本上也就一到两个,不会再多了,否则脚本会卡顿,甚至直接崩溃。
(三)我只有一个函数,可不可以启动多个子线程?
可以,一个函数启动两次,就会有两个子线程。比如:
Thread.Start 主程序
Thread.Start 主程序
Function 主程序()
//这里面是我的脚本主要的功能操作
End Function
这段代码运行以后,脚本是有两个主程序代码同时运行。
通常我们不会这样用,为了防止一个函数被反复使用,会把启动线程赋值给一个变量。
dim h=Thread.Start(主程序)
赋值给一个变量的好处是啥呢?
如果想要停止某个线程的时候,直接用停止线程命令停止对应的变量。
Thread.Stop (h)
(四)子线程能不能关闭或者启动别的子线程?
不能,控制子线程的开启和关闭只能是主线程。如果想要一个子线程控制另外一个子线程,就需要借助共享变量把“控制信号”先发给主线程,然后在让主线程控制另外一个子线程关闭或者开启。
(五)多线程的脚本可以使用全局变量吗?
不可以,有些朋友写了一个单线程的脚本,测试也没问题,后来觉得脚本运行久了可能会出现卡顿的现象,于是想要加个检测卡顿的子线程。可是原本正常运行的脚本没有做任何变化,变成多线程以后就不能用了。
这是因为原本脚本中可能用到全局变量了,变成多线程以后,全局变量失效导致脚本错误。
什么是按键的全局变量?
Dim m=1
Call 函数()
Function 函数()
TracePrint m
End Function
上面这段代码中变量m是在函数外面定义的,这个就是按键的全局变量。同理还有一个局部变量,就是在函数里面定义的变量。
为了减少上面说到的问题,我们尽量定义局部变量。也就是一个函数中用到所有变量尽量在它内容部搏孙定义。
(六)子线程中可以调用函数吗?
可以,但是要注意写法,下面说几个多线程中可能会写错的地方。
①启动子线程的时候代码中,子线程名称后面不能有括号
Thread.Start(主程序) //正确写法
Thread.Start(主程序()) //错误写法
②启动带参数的子线程
Thread.Start(主程序(参数1,参数2)) //错误写法
Thread.Start(主程序,参数1,参数2) //正确写法
③子程序中调用函数
Call 函数 //错误写法
Call 函数() //正确写法
(七)哪些地方可能会用到多线程
我们以双线程为例,一般来说主线程会做袜培非操作性的功能,子线程做具体操作功能。
非操作性的功能,比如:
①检测卡顿
②实时屏幕显示内容
③心跳检测
这些操作有一个共同的特点,不影响界面上原有的其他操作。
我平时写脚本基本上是不用多线程的,一是我写长期运行的脚本不多,没有多线程的需求,二是多线程容易造成脚本卡顿。
当然我不用不代表别人也不用,最近就看到群里有一些朋友在问关于多线程的问题,确实对于新手朋友来说容易出问题。
下面就说一下我对于多线程的一些理解:
(一)什么是主线程、什么是子线程
先说一个误区:相信很多新手朋友会觉得主线程是这样的:
Function 主程序()
//这里面是我的脚本主要的功能操作
End Function
这明显是错误的,在多线程脚本中,区分主线程的方法是看它是不是不在function或者sub内部,只要没在函数内部的就是主线程。至于说取个主程序或者主线程这类名字,和它是不是主线程没有一点关系。
上面说的是主线程,再来说说子线程是什么?
只要用Thread.Start启动的都是子线程。比如:
Thread.Start 主程序
Function 主程序()
//这里面是我的脚本主要的功能操作
End Function
当然没有启动的函数就不算了。
(二)子线程可以有多少个?
从语告银唯法角度来说没有限制,你写多少个都可以,但是实际应用中基本上也就一到两个,不会再多了,否则脚本会卡顿,甚至直接崩溃。
(三)我只有一个函数,可不可以启动多个子线程?
可以,一个函数启动两次,就会有两个子线程。比如:
Thread.Start 主程序
Thread.Start 主程序
Function 主程序()
//这里面是我的脚本主要的功能操作
End Function
这段代码运行以后,脚本是有两个主程序代码同时运行。
通常我们不会这样用,为了防止一个函数被反复使用,会把启动线程赋值给一个变量。
dim h=Thread.Start(主程序)
赋值给一个变量的好处是啥呢?
如果想要停止某个线程的时候,直接用停止线程命令停止对应的变量。
Thread.Stop (h)
(四)子线程能不能关闭或者启动别的子线程?
不能,控制子线程的开启和关闭只能是主线程。如果想要一个子线程控制另外一个子线程,就需要借助共享变量把“控制信号”先发给主线程,然后在让主线程控制另外一个子线程关闭或者开启。
(五)多线程的脚本可以使用全局变量吗?
不可以,有些朋友写了一个单线程的脚本,测试也没问题,后来觉得脚本运行久了可能会出现卡顿的现象,于是想要加个检测卡顿的子线程。可是原本正常运行的脚本没有做任何变化,变成多线程以后就不能用了。
这是因为原本脚本中可能用到全局变量了,变成多线程以后,全局变量失效导致脚本错误。
什么是按键的全局变量?
Dim m=1
Call 函数()
Function 函数()
TracePrint m
End Function
上面这段代码中变量m是在函数外面定义的,这个就是按键的全局变量。同理还有一个局部变量,就是在函数里面定义的变量。
为了减少上面说到的问题,我们尽量定义局部变量。也就是一个函数中用到所有变量尽量在它内容部搏孙定义。
(六)子线程中可以调用函数吗?
可以,但是要注意写法,下面说几个多线程中可能会写错的地方。
①启动子线程的时候代码中,子线程名称后面不能有括号
Thread.Start(主程序) //正确写法
Thread.Start(主程序()) //错误写法
②启动带参数的子线程
Thread.Start(主程序(参数1,参数2)) //错误写法
Thread.Start(主程序,参数1,参数2) //正确写法
③子程序中调用函数
Call 函数 //错误写法
Call 函数() //正确写法
(七)哪些地方可能会用到多线程
我们以双线程为例,一般来说主线程会做袜培非操作性的功能,子线程做具体操作功能。
非操作性的功能,比如:
①检测卡顿
②实时屏幕显示内容
③心跳检测
这些操作有一个共同的特点,不影响界面上原有的其他操作。
展开全部
附件:编辑脚本的时候 上方有“附件”
如果不想用附件:可以把直接用图的路径
或薯辩者,插入图片的旦猛时候,把“使用附件图片路径模手桥”的勾去掉~
记得给分~
如果不想用附件:可以把直接用图的路径
或薯辩者,插入图片的旦猛时候,把“使用附件图片路径模手桥”的勾去掉~
记得给分~
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一、获取指定点的颜色
得到指定点颜色
通过设置上面的屏幕坐标X、Y来获取指定点的坐标颜色,然后将返回值传递给一个变量存储颜色值。设置乎兆完成后插入,即可以在代码视图中看到源码了。
颜色值传递给了变量“GetColor”,我们就可以利用这个颜色值来判断下一步要做哪些操作了。
假设颜色值是“00FF00”的话,我们的判断语句就可以这么写。
GetColor=GetPixelColor(10,5)
If GetColor="00FF00"
End If
这样子组合一起即可判断一个点的颜色是不是我们想要的那个颜色,这与IfColor语句是一样的效果。
二、区域找色
在实际运用中有些点的颜色或者是位置会随着窗口的移动而变化,导致获取点的颜色值不一致。而区域找色就能为我们解决这个问题。
多点找色是在一个矩形区域内查找和颜色值相匹配的点坐标。如上图我们可以看到,区域找色需设置左上角坐标X、Y,右下角坐标X、Y,颜色值,返回值坐标X、Y等七个参数。
而这里面需要注意的有2点:
1、右下角的X、Y坐标值必须比左上角的X、Y大,否则就会变成一个无效的矩形区域。
2、颜色值是一个16进制的颜色值,并且必须加引号。
我悉悄们先以默认配置直接插入到脚本中。从参数配置上看是在左上(0,0),右下角(1024,768)这块矩形区域内查找颜色值为“0000FF”的坐标点,并把返回值分别赋值给intX和intY。
那么我们就可以通过返回值intX和intY来判断是否找到了,在按键中如果没有找到指定的颜色点的话,返回值都是 “-1”。我们就根据这个条件来判断是否找岁陆租到颜色点。判断intX和intY,如果它们的值都大于0那么就代表找到了,我们就把鼠标移动到这两个点上去。
FindColor 0,0,1024,768,"0000FF",intX,intY
If intX > 0 And intY > 0 Then
MoveTo intX,intY
End If
如上代码,在执行的时候,如果有找到“0000FF”的颜色点鼠标就会移动到那一点了。如果没有的话就不会做任何操作了。
三、区域模糊找色
区域模糊找色是在区域找色的基础上扩展的一个功能。有的颜色点会因为系统或者是硬件的原因导致他们的颜色出现一点偏差或者是我们要找的只是相似的颜色那么模糊找色就可以满足我们的需求了。
和区域找色不同的是,模糊找色多了两个参数。分别是“查找类型”和“颜色相似度”。
查找类型总的分为三种:分别是从左上到右下,从中心找,从右下到左上。
颜色相似度:是用来设置与当前查找颜色的相似度,取值从0.5-1不等,推荐使用0.9。
四、区域找图
如果取色或者是找色都无法准确地完成你想要的查找目的的话,那么区域找图就是另外的一个选择。
找图命令中除了区域,相似度,路径,最重要的是图片路径。
图片路径:所以查找的图片源路径,可以是绝对路径。也可以将图片添加到附件,然后使用附件路径。
得到指定点颜色
通过设置上面的屏幕坐标X、Y来获取指定点的坐标颜色,然后将返回值传递给一个变量存储颜色值。设置乎兆完成后插入,即可以在代码视图中看到源码了。
颜色值传递给了变量“GetColor”,我们就可以利用这个颜色值来判断下一步要做哪些操作了。
假设颜色值是“00FF00”的话,我们的判断语句就可以这么写。
GetColor=GetPixelColor(10,5)
If GetColor="00FF00"
End If
这样子组合一起即可判断一个点的颜色是不是我们想要的那个颜色,这与IfColor语句是一样的效果。
二、区域找色
在实际运用中有些点的颜色或者是位置会随着窗口的移动而变化,导致获取点的颜色值不一致。而区域找色就能为我们解决这个问题。
多点找色是在一个矩形区域内查找和颜色值相匹配的点坐标。如上图我们可以看到,区域找色需设置左上角坐标X、Y,右下角坐标X、Y,颜色值,返回值坐标X、Y等七个参数。
而这里面需要注意的有2点:
1、右下角的X、Y坐标值必须比左上角的X、Y大,否则就会变成一个无效的矩形区域。
2、颜色值是一个16进制的颜色值,并且必须加引号。
我悉悄们先以默认配置直接插入到脚本中。从参数配置上看是在左上(0,0),右下角(1024,768)这块矩形区域内查找颜色值为“0000FF”的坐标点,并把返回值分别赋值给intX和intY。
那么我们就可以通过返回值intX和intY来判断是否找到了,在按键中如果没有找到指定的颜色点的话,返回值都是 “-1”。我们就根据这个条件来判断是否找岁陆租到颜色点。判断intX和intY,如果它们的值都大于0那么就代表找到了,我们就把鼠标移动到这两个点上去。
FindColor 0,0,1024,768,"0000FF",intX,intY
If intX > 0 And intY > 0 Then
MoveTo intX,intY
End If
如上代码,在执行的时候,如果有找到“0000FF”的颜色点鼠标就会移动到那一点了。如果没有的话就不会做任何操作了。
三、区域模糊找色
区域模糊找色是在区域找色的基础上扩展的一个功能。有的颜色点会因为系统或者是硬件的原因导致他们的颜色出现一点偏差或者是我们要找的只是相似的颜色那么模糊找色就可以满足我们的需求了。
和区域找色不同的是,模糊找色多了两个参数。分别是“查找类型”和“颜色相似度”。
查找类型总的分为三种:分别是从左上到右下,从中心找,从右下到左上。
颜色相似度:是用来设置与当前查找颜色的相似度,取值从0.5-1不等,推荐使用0.9。
四、区域找图
如果取色或者是找色都无法准确地完成你想要的查找目的的话,那么区域找图就是另外的一个选择。
找图命令中除了区域,相似度,路径,最重要的是图片路径。
图片路径:所以查找的图片源路径,可以是绝对路径。也可以将图片添加到附件,然后使用附件路径。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询