[遠航筆記流水賬]六套大漠多線程高級第一章


1.中控台組件的簡單應用講解

本節課沒什么多說的 主要是講解了下超級列表框的常見的屬性方法

小知識:超級列表框的基本設置

image

image

image

image

小知識:超級列表框的常見操作

1.設置列項

沒什么可說的一般而言列項基本不會變化  鼠標右鍵在超級列表框上選 設置報表列 即可

2.插入每行數據 插入每行的單個項數據,

image

注意

表項索引是從0開始的 而不是從1開始  而且列索引也是從0

3 獲取超級列表框內的數據個數

取表項數()

4 刪除指定某項和全部刪除

image

5遍歷各個記錄 獲取其對應的勾選狀態和其他數據

image

結果

image

代碼

image

6.取出當前被選中的記錄的內容

image 注意其實這就是表項索引 都是從0開始的 如果沒有選中任何一個 則返回-1

image

7 常用事件 _超級列表框1_右鍵單擊表項  和配合常見的右鍵菜單的用法

轉到了第三課

8

2.易大漠多線程高級之半自動玩家版中控台界面說明

中控台的作用 就是我們的基本上所有的操作都可以在中控台上操作 所有需要的信息都可以從中控台了解  而無需自己親自去操作那游戲窗口來實現和獲取

3.易大漠多線程高級之中控台菜單應用

1.制作菜單 ---通過窗口--鼠標右鍵 菜單編輯器 就可以構建自己的菜單 沒什么可說的

2.超級列表框的 右鍵單擊表項事件

image

該事件下 設置彈出菜單

image

效果

image

4.易大漠多線程高級之中控台刷新窗口列表

本節課沒有什么太重要的東西 無非就是取一下指定游戲的所有窗口信息寫入到超級列表框里

留個紀念 代碼

image

疑問: 后面 每個窗口都綁定好了各自的大漠對象正在對其操作的時候 如果此時突然出現一個情況 比如增加了窗口  我刷新列表出現一個新的游戲窗口 要如何讓這個窗口添加到大漠多線程信息數組里面 如又比如我關了一個窗口 這個窗口如何從原有的大漠多線程數組去掉  再把后面的大漠多線程數組元素依次提上來 腦袋很亂 沒想出什么合適的辦法

想了5個多點 總算想出來解決辦法 留個紀念 好歹也是費勁想出來的 可以解決之前的問題

本來考慮用二維數組來儲存窗口信息數據 后來覺得不如自定義類型的一維數組省事

image

.版本 2
.支持庫 iext
.支持庫 spec

.子程序 超級列表框刷新列表
.局部變量 進程窗口句柄數組, 整數型, , "0"
.局部變量 進程子窗口句柄數組, 整數型, , "0"
.局部變量 進程窗口標題數組, 文本型, , "0"
.局部變量 i, 整數型
.局部變量 ii, 整數型
.局部變量 j, 整數型
.局部變量 當前超級列表框內容數組, 超級列表框多線程記錄結構, , "0"
.局部變量 當前游戲窗口信息數組, 超級列表框多線程記錄結構, , "0"
.局部變量 新增的游戲窗口信息數組, 超級列表框多線程記錄結構, , "0"
.局部變量 是否找到相符的窗口句柄, 整數型
.局部變量 最終最新的超級列表框內容數組, 超級列表框多線程記錄結構, , "0"
.局部變量 臨時超級列表框多線程記錄結構變量, 超級列表框多線程記錄結構
.局部變量 當前最終最新的超級列表框內容數組的最后一個元素的id, 整數型

' 暫時沒考慮多線程下同時使用的沖突問題
' 問題:按照老師的寫法 一旦中途需要關閉其中一個窗口 或者新開幾個游戲窗口 這些關閉的窗口和新增的窗口會讓超級列表框的記錄的id重新改變 但是重要的是 這些id其實是和大漠多線程信息數組一一對應  直接改變了超級列表框記錄對應的Id 但是大漠多線程信息數組里面的id值 不能輕易改變 因為它不單單是個id數字 還對應着一個大漠對象和線程  這個大漠對象還可能正在綁定之前的指定窗口在運行線程 腳本 你總不能每次新增窗口或者關閉一個窗口就把所有窗口解綁  線程都關閉 然后讀取新的id重新開啟新線程 重新再次綁定窗口
' 個人解決辦法 刷新的時候 先把當前的超級列表框的所有游戲窗口信息都記錄到一個數組 然后 再把當前真正在運行的游戲窗口和信息也記錄到另外一個表 ,然后2個數組對比 獲取到新增的窗口的信息 記錄到一個新增數組 然后對比得到了 哪些窗口是已經關閉的 也記錄到關閉數組 然后就是在 原來的超級列表框記錄的基礎上進行刪減和增加操作(原來已經存在的窗口 id 標題 當前狀態都不用變動 在已經關閉的窗口對應的記錄那里  填寫進一個新增的窗口信息 但是id和原來的保持一樣 當然 替換之前自然要到大漠多線程信息數組查看下這個窗口對應的大漠對象是否還在綁定 線程是否關閉 沒有就要順手一關 然后再替換) 來構成一個最新的數組 然后把數組寫入到超級列表框內

' 1. 取得當前所有的進程名對應的窗口的對應窗口句柄 窗口標題 子窗口句柄 並把這些信息寫入一個數組
進程_名取所有句柄2 (#游戲進程名, 進程窗口句柄數組)  ' 窗口句柄
.計次循環首 (取數組成員數 (進程窗口句柄數組), i)
    加入成員 (進程子窗口句柄數組, 窗口_取句柄 (進程窗口句柄數組 [i], , “Edit”, ))  ' 子窗口句柄
    加入成員 (進程窗口標題數組, 窗口_取標題 (進程窗口句柄數組 [i]))  ' 窗口標題

    ' '(1)獲取現在所有游戲窗口的信息寫入到另外一個數組 該數組存儲現在的所有窗口信息
    臨時超級列表框多線程記錄結構變量.id = i
    臨時超級列表框多線程記錄結構變量.窗口標題 = 進程窗口標題數組 [i]
    臨時超級列表框多線程記錄結構變量.窗口句柄 = 進程窗口句柄數組 [i]
    臨時超級列表框多線程記錄結構變量.子窗口句柄 = 進程子窗口句柄數組 [i]
    臨時超級列表框多線程記錄結構變量.當前狀態 = “等待”
    加入成員 (當前游戲窗口信息數組, 臨時超級列表框多線程記錄結構變量)
    輔助延時 (1)
.計次循環尾 ()
' 調試輸出 (“當前游戲窗口信息數組:↓↓↓↓↓↓↓”)
.' 計次循環首 (取數組成員數 (當前游戲窗口信息數組), i)
    ' 調試輸出 (當前游戲窗口信息數組 [i].窗口標題)
    ' 輔助延時 (1)
.' 計次循環尾 ()
' 調試輸出 (“當前游戲窗口信息數組:↑↑↑↑↑↑↑”)

' 2 獲取當前超級列表框記錄的之前的所有游戲窗口的信息 並寫入到一個數組
.計次循環首 (_啟動窗口.超級列表框1.取表項數 (), i)
    臨時超級列表框多線程記錄結構變量.id = 到整數 (_啟動窗口.超級列表框1.取標題 (i - 1, 0))
    臨時超級列表框多線程記錄結構變量.窗口標題 = _啟動窗口.超級列表框1.取標題 (i - 1, 1)
    臨時超級列表框多線程記錄結構變量.窗口句柄 = 到整數 (_啟動窗口.超級列表框1.取標題 (i - 1, 2))
    臨時超級列表框多線程記錄結構變量.子窗口句柄 = 到整數 (_啟動窗口.超級列表框1.取標題 (i - 1, 3))
    臨時超級列表框多線程記錄結構變量.當前狀態 = _啟動窗口.超級列表框1.取標題 (i - 1, 4)
    加入成員 (當前超級列表框內容數組, 臨時超級列表框多線程記錄結構變量)
    輔助延時 (1)
.計次循環尾 ()
' 調試輸出 (“當前超級列表框內容數組:↓↓↓↓↓↓↓”)
.' 計次循環首 (取數組成員數 (當前超級列表框內容數組), i)
    ' 調試輸出 (當前超級列表框內容數組 [i].窗口標題)
    ' 輔助延時 (1)
.' 計次循環尾 ()
' 調試輸出 (“當前超級列表框內容數組:↑↑↑↑↑↑↑”)

' 3.兩個數組對比得到新增的窗口信息寫入一個數組
.計次循環首 (取數組成員數 (當前游戲窗口信息數組), i)
    是否找到相符的窗口句柄 = -1
    .計次循環首 (取數組成員數 (當前超級列表框內容數組), j)
        .如果真 (當前游戲窗口信息數組 [i].窗口句柄 = 當前超級列表框內容數組 [j].窗口句柄)
            是否找到相符的窗口句柄 = 1
            跳出循環 ()
        .如果真結束
        輔助延時 (1)
    .計次循環尾 ()
    .如果真 (是否找到相符的窗口句柄 = -1)
        ' 把這個元素添加到新數組 這個數組就是存儲新增的窗口信息
        加入成員 (新增的游戲窗口信息數組, 當前游戲窗口信息數組 [i])
    .如果真結束

    輔助延時 (1)
.計次循環尾 ()

' 調試輸出 (“新增的游戲窗口信息數組:↓↓↓↓↓↓↓”)
.' 計次循環首 (取數組成員數 (新增的游戲窗口信息數組), i)
    ' 調試輸出 (新增的游戲窗口信息數組 [i].窗口標題)
    ' 輔助延時 (1)
.' 計次循環尾 ()
' 調試輸出 (“新增的游戲窗口信息數組:↑↑↑↑↑↑↑”)


' 4.循環遍歷老的超級列表框記錄數組 找到已經被關閉的窗口記錄 先檢查其id對應的線程和大漠對象是否解綁 沒有則關閉和解綁 然后在已經關閉的窗口記錄位置 用新增窗口信息替換它 不過保留原始id,然后把新的窗口記錄信息寫到最終的數組里面
' 最終最新的超級列表框內容數組
.計次循環首 (取數組成員數 (當前超級列表框內容數組), i)
    是否找到相符的窗口句柄 = -1
    .計次循環首 (取數組成員數 (當前游戲窗口信息數組), j)
        .如果真 (當前超級列表框內容數組 [i].窗口句柄 = 當前游戲窗口信息數組 [j].窗口句柄)
            是否找到相符的窗口句柄 = 1
            跳出循環 ()
        .如果真結束
        輔助延時 (1)
    .計次循環尾 ()
    .如果 (是否找到相符的窗口句柄 = -1)
        ' 說明當前的列表框的記錄對應的窗口句柄已經失效了 要檢查下其對應的句柄 和 對應的線程是否存在
        調試輸出 (“標題:[” + 到文本 (當前超級列表框內容數組 [i].窗口標題) + “] id:[” + 到文本 (當前超級列表框內容數組 [i].id) + “]屬於被刪除的窗口 ”)

        .如果真 (大漠多線程信息 [i].窗口句柄 > 0 且 大漠多線程信息 [i].線程句柄 > 0)
            ' 判斷下對應的線程是否還在運行 (線程_取中止線程退出代碼 ())還在運行則停止線程 解綁窗口 (大漠.綁定_判斷 ())
            .如果真 (線程_取中止線程退出代碼 (大漠多線程信息 [i].線程句柄) = 2)
                線程_強制結束 (大漠多線程信息 [i].線程句柄)
                線程_關閉句柄 (大漠多線程信息 [i].線程句柄)
                大漠多線程信息 [i].線程句柄 = 0
                調試輸出 (“線程[” + 到文本 (i) + “] 關閉完畢”)
            .如果真結束

            .如果真 (大漠多線程信息 [i].大漠.綁定_判斷 (大漠多線程信息 [i].整數參數一) = 1)  ' 整數參數一里面存放的就是子窗口句柄
                大漠多線程信息 [i].大漠.解綁 ()
                大漠多線程信息 [i].窗口句柄 = 0
                調試輸出 (“綁定[” + 到文本 (i) + “] 解綁完畢”)
            .如果真結束

        .如果真結束
        ' 這里從 新增的游戲窗口信息數組 取第一個元素來插入這里 如果這個數組已經為空了 那么這個元素的所有內容為空得了
        .如果 (取數組成員數 (新增的游戲窗口信息數組) > 0)
            加入成員 (最終最新的超級列表框內容數組, 新增的游戲窗口信息數組 [1])
            最終最新的超級列表框內容數組 [取數組成員數 (最終最新的超級列表框內容數組)].id = 當前超級列表框內容數組 [i].id  ' 繼承了之前的那個id 雖然以前的窗口已經不在了
            刪除成員 (新增的游戲窗口信息數組, 1, 1)

        .否則

        .如果結束


    .否則
        ' 找到了相符的句柄就不用多費勁了
        加入成員 (最終最新的超級列表框內容數組, 當前超級列表框內容數組 [i])
        調試輸出 (“標題:[” + 到文本 (當前超級列表框內容數組 [i].窗口標題) + “] id:[” + 到文本 (當前超級列表框內容數組 [i].id) + “]存在於上次的列表框記錄 直接插入新數組”)
    .如果結束

    輔助延時 (1)
.計次循環尾 ()
' 5 看看新增的窗口數組里面還有沒有剩余的元素 有則追尾給最終數組加上去 注意對應的id要接着最終數組最后一個元素的id+1 不能用計次循環的i
.如果真 (取數組成員數 (新增的游戲窗口信息數組) > 0)
    .計次循環首 (取數組成員數 (新增的游戲窗口信息數組), i)
        當前最終最新的超級列表框內容數組的最后一個元素的id = 最終最新的超級列表框內容數組 [取數組成員數 (最終最新的超級列表框內容數組)].id
        加入成員 (最終最新的超級列表框內容數組, 新增的游戲窗口信息數組 [i])
        ' 新增的游戲窗口信息數組 [i].id = 當前最終最新的超級列表框內容數組的最后一個元素的id+1
        輔助延時 (1)
    .計次循環尾 ()

.如果真結束
' 調試輸出 (“最終最新的超級列表框內容數組:↓↓↓↓↓↓↓”)
.' 計次循環首 (取數組成員數 (最終最新的超級列表框內容數組), i)
    ' 調試輸出 (最終最新的超級列表框內容數組 [i].窗口標題)
    ' 輔助延時 (1)
.' 計次循環尾 ()
' 調試輸出 (“最終最新的超級列表框內容數組:↑↑↑↑↑↑↑”)

' 6 清理列表框
_啟動窗口.超級列表框1.全部刪除 ()

' 7 把剛才獲取的最終數組信息寫入到超級列表框
.計次循環首 (取數組成員數 (最終最新的超級列表框內容數組), i)
    _啟動窗口.超級列表框1.插入表項 (, , , , , )
    _啟動窗口.超級列表框1.置標題 (i - 1, 0, 到文本 (最終最新的超級列表框內容數組 [i].id))
    _啟動窗口.超級列表框1.置標題 (i - 1, 1, 最終最新的超級列表框內容數組 [i].窗口標題)
    _啟動窗口.超級列表框1.置標題 (i - 1, 2, 到文本 (最終最新的超級列表框內容數組 [i].窗口句柄))
    _啟動窗口.超級列表框1.置標題 (i - 1, 3, 到文本 (最終最新的超級列表框內容數組 [i].子窗口句柄))
    _啟動窗口.超級列表框1.置標題 (i - 1, 4, “等待.”)
    輔助延時 (1)
.計次循環尾 ()

小知識:需要二維數組的場合 考慮下自定義類型的一維數組可能會更加的簡單省事

image

用法和一維數組基本一致  不用二維數組的重定義數組命令和嵌套循環  好麻煩

比如加入成員

image

image


小知識:易語言下的整數型變量 如果不賦值 默認初始是什么(結果為0)

.版本 2
.支持庫 spec

.局部變量 aa, 整數型

調試輸出 (“[” + 到文本 (aa) + “]”)
.如果 (aa = 0)
    調試輸出 (0)

.否則
    調試輸出 (“不是0”)

.如果結束
調試輸出 (aa)


結果

* “[0]”
* 0
* 0
被調試易程序運行完畢

5.1易大漠多線程高級之中控台多窗口執行相同任務1

自己備用:后面的課程其實非常簡單 但是感覺老師只是演示了一個非常簡單的中控 很多地方並沒有說的太明白 我索性按照老師的思路重寫了一個 給自己留下個紀念 備以后查看復習

問題:這個自寫的中控沒有考慮多線程沖突 雖然每個窗口都有自己的許可證來進行操作 只是一個思路結構

因為沒有合適的游戲 就以常見的寫字板作為游戲窗口測試

全局變量
1.大漠多線程信息 數組 - 模塊自帶的 基本結構如下

image
2 許可證數組 -自己定義的初始元素個數為0
3 全局大漠 變量-  模塊自帶的
4 游戲進程名- 用於確定綁定的是什么游戲窗口 這里我就用記事本的Notepad.exe就是
5 窗口指定寬 窗口指定高 -控制窗口寬高 方便后面有序排列窗口


常量
大漠注冊碼 大漠輔助碼

自定義數據類型

image

常用到的3個部分(每個功能都要考慮這3個部分的處理)
(1)超級列表框 用來存放中控內的窗口信息
(2)最新的游戲窗口信息:超級列表框刷新 函數 用來把最新的游戲窗口信息刷新進超級列表框
(3)大漠多線程信息數組 用來記錄目前的游戲窗口的信息 包括線程信息 里面的結構說一下

最核心的東西:

超級列表框每個記錄對應的id --這個東西貫穿上面的3個部分 還是許可證數組也有對應

功能函數思路
1.超級列表框刷新
獲取當前超級列表框里的窗口信息數據 然后獲取當前游戲窗口的信息數據 二者對比 找出 哪些窗口是新添加的 哪些窗口已經關閉了 (核心思路是盡量保證原來的窗口對應的Id不變 除非窗口關閉了 因為一旦窗口對應的id變了 那么就需要修改 大漠多線程信息數組  對應的信息 還要判斷對應的線程和其他東西)確定哪些窗口已經關閉了 在原來的超級列表框上找到它的位置 用 新添加的窗口信息 代替它 當然 id不用換 還用原來的id即可 如果已經關閉的窗口已經被填補完畢 還剩下一些新添加的窗口信息沒處放 就加到超級列表框的末尾 注意這些新添加的窗口對應的id要變動 按照之前超級列表框里面最后一個記錄的id加一即可
2.單個啟動
獲取超級列表框的選中項 找到對應的id 窗口句柄  根據id找到 大漠多線程信息 里面的內容 找出其記錄的線程id還是還在運行 大漠對象是否還綁定窗口 如果在運行再綁定就關閉解綁下 處理完畢就開始准備啟動線程  啟動線程成功把新的線程id 窗口句柄子窗口句柄 標題 當前狀態寫入到 大漠多線程信息 對應的元素里面 結束
3.單個停止
獲取超級列表框的選中項 找到對應的id 窗口句柄  根據id找到 大漠多線程信息 里面的內容 找出其記錄的線程id還是還在運行 大漠對象是否還綁定窗口 如果在運行再綁定就關閉解綁下 關閉成功 把 大漠多線程信息 對應的元素里面的線程id和其他 窗口句柄 當前狀態等信息都抹除掉
4 掛起(暫停)
獲取超級列表框的選中項 找到對應的id 窗口句柄  根據id找到 大漠多線程信息 里面的內容 找出其記錄的線程id還是還在運行 大漠對象是否還綁定窗口 在運行 則掛機下線程 判斷是否成功  成功則把 大漠多線程信息數組 里面的對應狀態修改為掛起 超級列表框里面的當前抓鬼太也修改為掛起
5 恢復
獲取超級列表框的選中項 找到對應的id 窗口句柄  根據id找到 大漠多線程信息 里面的內容 找出其記錄的線程id還是還在運行 在運行 則恢復下線程 判斷是否成功  成功則把 大漠多線程信息數組 里面的對應狀態修改為啟動 超級列表框里面的當前抓鬼太也修改為啟動
6 全部啟動
無非就是遍歷當前的超級列表框里面的所有窗口的信息 一個一個的單個啟動即可 沒太多說法
7 全部停止
無非就是遍歷當前的超級列表框里面的所有窗口的信息 一個一個的單個停止即可 沒太多說法
8全部隱藏
無非就是遍歷當前的超級列表框里面的所有窗口的信息 一個個的把窗口挪到屏幕外即可
9 全部有序顯示
無非就是遍歷當前的超級列表框里面的所有窗口的信息 然后按照規定的大小依次排列
10 銷毀清理
窗口銷毀調用的函數 清理雜七雜八的東西 也可以再停止按鈕上觸發
(1)把超級列表框的窗口信息讀進數組 根據數組元素對應的線程id 關閉線程 和解綁窗口 然后把 大漠多線程信息里面記錄的比如窗口句柄 當前狀態 線程id等等信息清空
(2)根據超級列表框的窗口信息對應的Id 把許可證數組也清理一下
(3)清空超級列表框(萬一是停止觸發了該函數)
11 單個窗口清理
基本上是用於單個線程中途出現意外崩解 用這個函數來關閉線程和解綁  並把超級列表框的對應的該窗口的當前狀態修改下


代碼過多 無法發上來  平時學習測試用的 比較雜亂  里面沒有注冊碼和輔助碼 其他在

鏈接:https://pan.baidu.com/s/1l0dUc3ECJrxbs4gmJHuGow
提取碼:btbp
復制這段內容后打開百度網盤手機App,操作更方便哦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM