目前而言基本的自己理解的中控多線程腳本無非就是兩種
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 結果 = "關閉" ThenDelay 20000 //等待20秒 然后再次檢測中控發過來的指令 End IfDelay 1000 Loop//多線程函數 這個多線程負責和中控定時交流信息 把腳本的運行情況實時匯總給中控 //然后從中控那邊接收一些數據和控制命令 比如 Sub 多線程_中控交互()DoCall 中控交互() //這個函數負責連接中控 把本地的腳本運行狀態和其他必要的信息上傳給中控 然后接收中控給予的運行指令和當前設備對應的配置項內容等東西 Delay 10000LoopEnd 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 IfElseIf 結果 = "關閉" ThenThread.Stop 線程idDelay 20000 //等待20秒 然后再次檢測中控發過來的指令 End IfDelay 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,"手機按鍵圖標")DoCall 切換賬號()Call 登陸()Call 簽到和領取禮物()Delay 1000LoopEnd 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
這兩種各有各的好處
個人傾向第二種 結構更加清晰 但是需要注意 多線程內的全局變量的聲明和賦值方法