首页 > 技术文章 > [远航笔记流水账]六套大漠多线程高级第一章

zjl8455482 2019-03-07 19:54 原文

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,操作更方便哦

推荐阅读