据统计90%查看本帖的人,都已经注册本站了哦
您需要 登录 才可以下载或查看,没有账号?立即注册
×
简析多线程逻辑
本章适用于有一定易语言基础想发展学习post方面的人
阅读,文章根据个人学习经验所写,如果有错误请指出。
QQ交流群:308780188
阿正QQ:964269020
公众号:阿正易语言
博客: www.eyuyan.vip
看了上一章,很多人肯定很懵逼。那么这章我们就来结合简单的实例来了解下
多线程。
首先我们来看看之乎者也大小姐的多线程(个人稍加改动版本)
从截图可以看出,这份多线程采用的是---按钮启动一个线程(控制线程)----然
后通过相关变量存句柄、传参数、判断线程状态---启动工作线程
首先,我们来说说第一步(为什么用启动线程的方式来启动总控制线程):
.版本 2
.DLL命令 CreateThread, 整数型, "kernel32.dll", "CreateThread", , , 建立新的线程
.参数 lpThreadAttributes, 整数型, , 默认SECURITY_ATTRIBUTES结构
.参数 dwStackSize, 整数型, , 设置初始栈的大小,以字节为单位,如果为0,那么
默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需
要动态延长堆栈的大小
.参数 lpStartAddress, 子程序指针, , 指向线程函数的指针,形式:@函数名,函数
名称没有限制,但是必须以下列形式声明
.参数 lpParameter, 整数型, , 向线程函数传递的参数,是一个指向结构的指针,不
需传递参数时,为NULL
.参数 dwCreationFlags, 整数型, , 线程标志,0立即激活,1表示启动后处于挂起状态
---线程恢复
.参数 lpThreadId, 整数型, , 保存新线程的id 线程句柄
大家注意,这里创建出来的线程,是返回了线程句柄的,作用就是在于这个句
柄,我们都知道,线程可以暂停、挂起、许可区等操作,那么把这个总控以线程的
方式启动,并且获得线程句柄,那么就是为了以后的暂停、结束等操作。
第二步是总控制里面的操作:
在总控制里面,我们首先确定的是需要启动的线程数、线程数量这两个关键点
,同时也要创建完我们的许可证、线程句柄数组。
我们先来看这里的单个线程的操作,我们先使用打开内存文件()这个命令得
到一个内存地址,然后通过写出数据()这个命令往这个地址里面写出我们想要的
数据。通过这样的方式可以满足我们大量的数据交互。因为可以发现,这个写出数
据是没有上限的(但是局限在于32位的进制限制等等,建议不要写出超过3M的数
据),但是对于我们只要传过去一个序号、一个账号这些还是能够满足的。
通过易语言自带的启动线程来启动,然后返回的句柄就添加进我们建立好的句
柄变量数组,这样就把这个句柄存起来了,便于我们后面的对线程的操作。
启动好线程后,我们在局部的当前启动数量这个也需要加一,毕竟这个线程数
量我们还是得要控制的。
第三步:
接下来就是主要判断的控制了
我们通过判断当前启动数量和我们需要启动数量相同的时候,我们就开始去判
断我们线程的运作状态,,核心命令是 线程_等待() api是WaitForSingleObject (线
程句柄数组 [局_计次], 25000)
这个命令需要两个参数,参数一是线程句柄,线程等待时间 毫秒
这份命令是线程等待2.5秒后,就去结束线程,因为这里只是简单的本地组件的
操作,没有涉及其他,但是这个在于网页访问,接码打码的时候,是肯定不行的。
因为
如果一个线程执行时间平均是20秒,万一卡了一下,到了30秒,那么你20秒的
时候就结束了,那么肯定操作不玩
如果线程10秒就操作完了,但是还是要等待10秒才能继续下面的操作,那么就
相当于浪费了时间
综上所诉的问题我会在后面贴出我的解决方案,能够在线程操作完毕0.1秒内进
行下一步,同时对于超时的也会知己结束,判断更加精准。
第四步:
工作线程里面的数据处理,前面第二步里面我们启动工作线程的时候,我们传
入了文件号参数,那么我们就要去工作线程里面取出我们的数据来进行操作。
通过截图我们可以看到,首先我们数据这里是放在了许可区,这里是防止数据
混乱的,然后移到文件首() 来初始化数据,然后通过读入文件()命令来导出我们的数
据。记得一定要关闭文件()不然会因为文件没有关闭,内存的加大,然后导致软件的
崩溃,然后退出许可区,这样我们就拿到了我们需要的数据,这样我们就可以去愉
快的操作了。
总结下:准备工作线程的数据---启动工作线程—控制判断工作线程状态
工作线程:获取数据,销毁文件,防止串号
本章到此结束,下一章我们继续讲解完善这份多线程的bug。
阿正QQ 964269020 打赏支付宝 964269020@qq.com *正
|