目前而言基本的自己理解的中控多线程脚本无非就是两种
1.主代码作为脚本功能的载体 另外开辟一个线程作为和中控保持联系的部分(下面只是思路 无法直接运行)
Import "zm.luae" zm.Init /* 该思路下的基本流程 从UI界面获取到云账号 和 本地的配置信息---->根据自己的情况决定是上传当前配置到云端还是直接从云端读取配置信息----> 开始脚本的运行 脚本的主代码负责脚本的主要功能 脚本开启一个单独的多线程来负责与中控的交互---->通过多线程 我们把主代码里面、 的当前脚本运行状态 比如正在签到 正在切换账号等状态上传到中控 然后从中控端下载 中控的运行指令和对应的配置信息----> 通过 多线程的共享变量 主代码活得了中控的运行指令和云配置的内容 然后根据这2个信息来决定如何运行 */ //随便定义了一些常见的变量 变量内容没有任何意义 Dim intX,intY,结果,arr,brr,线程状态 Dim 找图_账号登陆界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 找图_登陆成功界面()=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 找图_签到界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 找图_签到完成界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 线程id=Thread.Start(多线程_中控交互)//开启多线程来负责和中控交互信息 Thread.SetShareVar "中控运行指令","开启"//这个多线程共享变量是用来控制整个脚本的开启关闭的一个开关变量 需要从中控 //获取运行指令 来决定脚本的功能的开启和关闭 默认值为 开启 可能是值为开启 和 关闭 Thread.SetShareVar "脚本状态","运行中" //这个多线程共享变量 是负责把主线程里面脚本运行到哪里了写入进入 //比如运行到了登陆操作了 就把这个多线程共享变量改为 登陆 二字 其他操作也是如此 Thread.SetShareVar "云配置","" //这个是用来从中控那边获取当前脚本对应的云配置内容的 多线程共享变量 按理说说默认值为本地配置构成的json字符串 //主代码 简单描述下常见脚本操作 Do //每次循环前 先看看多线程是否还在 不再则开启下 避免出现一些意外情况 线程状态 = "" 线程状态 = zm.ThreadStatus(线程id) If 线程状态 = "pending " Then //未启动 线程id=Thread.Start(多线程_中控交互) ElseIf 线程状态 = "running" Then //正在运行 这个正常 可以不用任何操作 ElseIf 线程状态 = "done" Then 线程id = Thread.Start(多线程_中控交互) ElseIf 线程状态 = "waiting" Then //等待不可能出现这个情况 因为我代码里面根本没有任何等待线程的命令 线程id = Thread.Start(多线程_中控交互) ElseIf 线程状态 = "cancelled" Then //被强制终止了 线程id = Thread.Start(多线程_中控交互) ElseIf 线程状态 = "error" Then //出错了 Thread.Stop 线程id//停止该线程 然后重启线程 Delay 2000 线程id = Thread.Start(多线程_中控交互) End If //判断下中控那边的运行指令 是否要停止正常的功能 结果 = "" 结果 = Thread.GetShareVar("中控运行指令") If 结果 = "开启" Then Call 切换账号() Call 登陆() Call 签到和领取礼物() ElseIf 结果 = "关闭" Then Delay 20000 //等待20秒 然后再次检测中控发过来的指令 End If Delay 1000 Loop //多线程函数 这个多线程负责和中控定时交流信息 把脚本的运行情况实时汇总给中控 //然后从中控那边接收一些数据和控制命令 比如 Sub 多线程_中控交互() Do Call 中控交互() //这个函数负责连接中控 把本地的脚本运行状态和其他必要的信息上传给中控 然后接收中控给予的运行指令和当前设备对应的配置项内容等东西 Delay 10000 Loop End Sub //这个函数负责连接中控 把本地的脚本运行状态和其他必要的信息上传给中控 然后接收中控给予的运行指令和当前设备对应的配置项内容等东西 Function 中控交互() //连接中控接口 无非是利用紫猫的netdata实现上传脚本状态 和下载当前设备对应的配置内容和 运行指令 ////先把本地设备的脚本状态等信息上传到中控 状态信息自然是通过多线程共享变量 Thread.GetShareVar "脚本状态" 来获取 zm.NetDataSet 当前设备的云账号,Thread.GetShareVar "脚本状态","云状态表" ////从中控接口获取当前设备的脚本对应的配置项内容 和 中控对脚本的运行指令 是开启还是关闭 这里还可以扩展 比如是否定时启动等其他的 Thread.SetShareVar "中控运行指令",从中控获取到的运行指令 Thread.SetShareVar "云配置",从中控获取到的云配置信息 End Function Function 切换账号() //把 多线程共享变量的 脚本状态改为 切换账号 Thread.SetShareVar "脚本状态","切换账号中" //主要切换账号操作 End Function Function 登陆() //把 多线程共享变量的 脚本状态改为 切换账号 Thread.SetShareVar "脚本状态","登陆中" //主要登陆操作 End Function Function 签到和领取礼物() //把 多线程共享变量的 脚本状态改为 切换账号 Thread.SetShareVar "脚本状态","签到和领取礼物中" //主要签到和领取礼物操作 End Function
2.主代码作为和中控保持联系的载体 另外开辟一个线程作为脚本功能的载体
Import "zm.luae" zm.Init /* 该思路下的基本流程 从UI界面获取到云账号 和 本地的配置信息---->根据自己的情况决定是上传当前配置到云端还是直接从云端读取配置信息----> 开始脚本的运行 脚本的主代码与中控交互 多线程只是f负责运行主功能 把脚本当前运行状态上传 下载对应的云配置信息和中控运行指令 放到多线程共享变量里面 (其实不用放到这里 因为多线程只负责主功能 不需要读取共享变量来做应对了)--->根据从中控获取到的2个数据 多线程通过thread.start 和thread.stop 来控制实现主功能的多线程的开关 这个思路比第一个思路要简单太多 但是会涉及到手机按键多线程和主线程 对于主线程中变量和函数的处理机制 */ //随便定义了一些常见的变量 变量内容没有任何意义 Dim intX,intY,结果,arr,brr,线程状态 Dim 找图_账号登陆界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 找图_登陆成功界面()=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 找图_签到界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 找图_签到完成界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Dim 线程id=Thread.Start(多线程_脚本主功能)//开启多线程 该多线程是用来负责脚本的正常功能 Thread.SetShareVar "中控运行指令","开启"//这个多线程共享变量是用来控制整个脚本的开启关闭的一个开关变量 需要从中控 //获取运行指令 来决定脚本的功能的开启和关闭 默认值为 开启 可能是值为开启 和 关闭 Thread.SetShareVar "脚本状态","运行中" //这个多线程共享变量 是负责把主线程里面脚本运行到哪里了写入进入 //比如运行到了登陆操作了 就把这个多线程共享变量改为 登陆 二字 其他操作也是如此 Thread.SetShareVar "云配置","" //这个是用来从中控那边获取当前脚本对应的云配置内容的 多线程共享变量 按理说说默认值为本地配置构成的json字符串 //主代码 主要负责和中控的交互 Do //和中控交互 上传和下载必要的东西 然后把得到的信息写入到多线程的共享变量里面 等待后续的处理使用 Call 中控交互() //判断下中控那边的运行指令 是否要停止正常的功能 结果 = "" 结果 = Thread.GetShareVar("中控运行指令") If 结果 = "开启" Then //先看看多线程是否还在 不再则开启下 避免出现一些意外情况 线程状态 = "" 线程状态 = zm.ThreadStatus(线程id) If 线程状态 = "pending " Then //未启动 线程id=Thread.Start(多线程_脚本主功能) ElseIf 线程状态 = "running" Then //正在运行 这个正常 可以不用任何操作 ElseIf 线程状态 = "done" Then 线程id = Thread.Start(多线程_脚本主功能) ElseIf 线程状态 = "waiting" Then //等待不可能出现这个情况 因为我代码里面根本没有任何等待线程的命令 线程id = Thread.Start(多线程_脚本主功能) ElseIf 线程状态 = "cancelled" Then //被强制终止了 线程id = Thread.Start(多线程_脚本主功能) ElseIf 线程状态 = "error" Then //出错了 Thread.Stop 线程id//停止该线程 然后重启线程 Delay 2000 线程id = Thread.Start(多线程_脚本主功能) End If ElseIf 结果 = "关闭" Then Thread.Stop 线程id Delay 20000 //等待20秒 然后再次检测中控发过来的指令 End If Delay 10000 Loop //多线程函数 这个多线程负责脚本主功能 Sub 多线程_脚本主功能() //因为手机按键多线程的特点 要在多线程内部拥有真正的全局变量 需要在主代码声明该变量 然后再多线程内赋值 这样才可以 找图_账号登陆界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") 找图_登陆成功界面()=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") 找图_签到界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") 找图_签到完成界面=array(22,57,526,318,"Attachment:手机按键图标.png","101010",0,0.8,100,"手机按键图标") Do Call 切换账号() Call 登陆() Call 签到和领取礼物() Delay 1000 Loop End Sub //这个函数负责连接中控 把本地的脚本运行状态和其他必要的信息上传给中控 然后接收中控给予的运行指令和当前设备对应的配置项内容等东西 Function 中控交互() //连接中控接口 无非是利用紫猫的netdata实现上传脚本状态 和下载当前设备对应的配置内容和 运行指令 ////先把本地设备的脚本状态等信息上传到中控 状态信息自然是通过多线程共享变量 Thread.GetShareVar "脚本状态" 来获取 zm.NetDataSet 当前设备的云账号,Thread.GetShareVar "脚本状态","云状态表" ////从中控接口获取当前设备的脚本对应的配置项内容 和 中控对脚本的运行指令 是开启还是关闭 这里还可以扩展 比如是否定时启动等其他的 Thread.SetShareVar "中控运行指令",从中控获取到的运行指令 Thread.SetShareVar "云配置",从中控获取到的云配置信息 End Function Function 切换账号() //把 多线程共享变量的 脚本状态改为 切换账号 Thread.SetShareVar "脚本状态","切换账号中" //主要切换账号操作 End Function Function 登陆() //把 多线程共享变量的 脚本状态改为 切换账号 Thread.SetShareVar "脚本状态","登陆中" //主要登陆操作 End Function Function 签到和领取礼物() //把 多线程共享变量的 脚本状态改为 切换账号 Thread.SetShareVar "脚本状态","签到和领取礼物中" //主要签到和领取礼物操作 End Function
这两种各有各的好处
个人倾向第二种 结构更加清晰 但是需要注意 多线程内的全局变量的声明和赋值方法