阿正 发表于 2017-3-19 16:14:31

读学易语言第六章|阿正_简析多线程

读学易语言第六章 | 阿正


简析多线程逻辑








本章适用于有一定易语言基础想发展学习POST方面的人

阅读,文章根据个人学习经验所写,如果有错误请指出。


QQ交流群:308780188


阿正QQ:964269020


公众号:阿正易语言


博客: www.eyuyan.vip


看了上一章,很多人肯定很懵逼。那么这章我们就来结合简单的实例来了解下

多线程。


首先我们来看看之乎者也大小姐的多线程(个人稍加改动版本)

https://docs.zoho.com.cn/writer/image.do?imgurl=60c55005f04ed37632305f71b7e9afae3fd45a483c18d082be8ab0d0638f329c6ebd437865afa63f2047d8d471bd192f























































































https://docs.zoho.com.cn/writer/image.do?imgurl=60c55005f04ed37632305f71b7e9afae3fd45a483c18d082be8ab0d0638f329cfa333956c51d9b8de2497e85ceff6cc7















从截图可以看出,这份多线程采用的是---按钮启动一个线程(控制线程)----然





后通过相关变量存句柄、传参数、判断线程状态---启动工作线程








首先,我们来说说第一步(为什么用启动线程的方式来启动总控制线程):


https://docs.zoho.com.cn/writer/image.do?imgurl=60c55005f04ed37632305f71b7e9afae3fd45a483c18d082be8ab0d0638f329c0b17b6a1df90f77af30d11669d3f5a9c


https://docs.zoho.com.cn/writer/image.do?imgurl=60c55005f04ed37632305f71b7e9afae3fd45a483c18d082be8ab0d0638f329c025458bdd6c3c6c99021660c48f1b67b


.版本 2





.DLL命令 CreateThread, 整数型, "kernel32.dll", "CreateThread", , , 建立新的线程


    .参数 lpThreadAttributes, 整数型, , 默认SECURITY_ATTRIBUTES结构


    .参数 dwStackSize, 整数型, , 设置初始栈的大小,以字节为单位,如果为0,那么

默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需

要动态延长堆栈的大小


    .参数 lpStartAddress, 子程序指针, , 指向线程函数的指针,形式:@函数名,函数

名称没有限制,但是必须以下列形式声明


    .参数 lpParameter, 整数型, , 向线程函数传递的参数,是一个指向结构的指针,不

需传递参数时,为NULL


    .参数 dwCreationFlags, 整数型, , 线程标志,0立即激活,1表示启动后处于挂起状态

---线程恢复


.参数 lpThreadId, 整数型, , 保存新线程的id   线程句柄








大家注意,这里创建出来的线程,是返回了线程句柄的,作用就是在于这个句

柄,我们都知道,线程可以暂停、挂起、许可区等操作,那么把这个总控以线程的

方式启动,并且获得线程句柄,那么就是为了以后的暂停、结束等操作。





第二步是总控制里面的操作:


在总控制里面,我们首先确定的是需要启动的线程数、线程数量这两个关键点

,同时也要创建完我们的许可证、线程句柄数组。


https://docs.zoho.com.cn/writer/image.do?imgurl=60c55005f04ed37632305f71b7e9afae3fd45a483c18d082be8ab0d0638f329c012a6803705eacfdbbaa75f8fb04afdd





我们先来看这里的单个线程的操作,我们先使用打开内存文件()这个命令得

到一个内存地址,然后通过写出数据()这个命令往这个地址里面写出我们想要的

数据。通过这样的方式可以满足我们大量的数据交互。因为可以发现,这个写出数

据是没有上限的(但是局限在于32位的进制限制等等,建议不要写出超过3M的数

据),但是对于我们只要传过去一个序号、一个账号这些还是能够满足的。


通过易语言自带的启动线程来启动,然后返回的句柄就添加进我们建立好的句

柄变量数组,这样就把这个句柄存起来了,便于我们后面的对线程的操作。


启动好线程后,我们在局部的当前启动数量这个也需要加一,毕竟这个线程数

量我们还是得要控制的。


第三步:


接下来就是主要判断的控制了


https://docs.zoho.com.cn/writer/image.do?imgurl=60c55005f04ed37632305f71b7e9afae3fd45a483c18d082be8ab0d0638f329c263c1c5a9cb3528af0800f2a47b900bc





我们通过判断当前启动数量和我们需要启动数量相同的时候,我们就开始去判

断我们线程的运作状态,,核心命令是线程_等待()api是WaitForSingleObject (线

程句柄数组 [局_计次], 25000)





这个命令需要两个参数,参数一是线程句柄,线程等待时间毫秒





这份命令是线程等待2.5秒后,就去结束线程,因为这里只是简单的本地组件的

操作,没有涉及其他,但是这个在于网页访问,接码打码的时候,是肯定不行的。


因为


如果一个线程执行时间平均是20秒,万一卡了一下,到了30秒,那么你20秒的

时候就结束了,那么肯定操作不玩


如果线程10秒就操作完了,但是还是要等待10秒才能继续下面的操作,那么就

相当于浪费了时间





综上所诉的问题我会在后面贴出我的解决方案,能够在线程操作完毕0.1秒内进

行下一步,同时对于超时的也会知己结束,判断更加精准。





第四步:


工作线程里面的数据处理,前面第二步里面我们启动工作线程的时候,我们传

入了文件号参数,那么我们就要去工作线程里面取出我们的数据来进行操作。


https://docs.zoho.com.cn/writer/image.do?imgurl=60c55005f04ed37632305f71b7e9afae3fd45a483c18d082be8ab0d0638f329c523a47c6a6b38344b72ffd4de22a2a65





通过截图我们可以看到,首先我们数据这里是放在了许可区,这里是防止数据

混乱的,然后移到文件首() 来初始化数据,然后通过读入文件()命令来导出我们的数

据。记得一定要关闭文件()不然会因为文件没有关闭,内存的加大,然后导致软件的

崩溃,然后退出许可区,这样我们就拿到了我们需要的数据,这样我们就可以去愉

快的操作了。








总结下:准备工作线程的数据---启动工作线程—控制判断工作线程状态





工作线程:获取数据,销毁文件,防止串号








本章到此结束,下一章我们继续讲解完善这份多线程的bug。






阿正QQ 964269020打赏支付宝 964269020@qq.com *正






Q363846184 发表于 2017-3-20 01:03:57

哈哈!又更新了,收藏了.

dzpos 发表于 2018-5-23 20:21:35

回复 学习看看
页: [1]
查看完整版本: 读学易语言第六章|阿正_简析多线程