易语言实现线程池多线程队列管理思路详解

需积分: 10 1 下载量 180 浏览量 更新于2024-11-06 收藏 443KB ZIP 举报
资源摘要信息: "线程池多线程队列思路-易语言" 易语言是一种简单易学的编程语言,主要面向中文用户,它提供了一套完整的中文编程环境,极大地降低了编程的入门门槛。在多线程编程领域,易语言通过其内置的模块支持了多线程操作,使得开发者能够更加便捷地进行多线程程序的设计和开发。然而,在多线程环境下操作界面控件可能会引起线程安全问题,因此需要通过特殊的方法来保证程序的稳定运行。本文档所述的"线程池多线程队列思路"正是解决这一问题的思路。 首先,我们需要了解线程池的概念。线程池(Thread Pool)是一种线程管理方式,它预先创建一定数量的线程,这些线程被组织在一个池中,当程序需要执行异步任务时,可以从线程池中取出一个线程来执行,任务执行完毕后,线程并不会销毁,而是返回线程池中等待下一次任务分配。这样可以减少频繁创建和销毁线程所带来的性能开销,提高程序的效率。 在易语言中,开发者可以通过引入"精易模块"来实现多线程编程。精易模块是针对易语言的扩展模块之一,它提供了丰富的多线程编程功能。而"鱼刺多线程6.0"是精易模块的一个版本,它进一步完善了多线程操作,提供了更多的功能和更稳定的性能。 在本文档所描述的思路中,提到了不直接在多线程内操作任何控件,而是利用队列来处理需要置超级列表框标题的请求。这是一种典型的生产者-消费者模式,线程池中的线程作为消费者,从队列中取出任务(即设置标题的操作)来执行,而生产者(主线程或其他线程)则负责将任务添加到队列中。这样做的好处是避免了线程间的直接操作和资源竞争,从而确保了线程安全。 具体到易语言实现,可以通过以下步骤来构建这样一个系统: 1. 创建一个队列,用于存放待处理的任务。 2. 线程池中的线程在启动时,不断检查队列是否为空,如果非空,则取出任务执行。 3. 任务的添加者(可以是主线程或其他线程)将需要执行的任务(如设置标题的操作)封装成特定格式,然后放入队列中。 4. 任务执行完毕后,线程返回队列等待下一次任务。 这种设计模式的优点在于: - 解耦合:生产者和消费者之间通过队列进行解耦,生产者无需关心任务是如何被执行的,消费者也无需知道任务的来源。 - 线程安全:由于所有任务都是通过队列进行中转,避免了多个线程同时操作同一资源,确保了线程安全。 - 高效性:线程池中的线程复用机制减少了线程创建和销毁的开销,提高了系统性能。 在实际应用中,易语言的线程池和队列操作可以借助精易模块的相关功能来实现,例如使用模块中提供的线程创建和同步等API。另外,由于本文档参与的是2020开源大赛(第五届),作者也可能是出于参与大赛的目的,分享了自己的一个思路,旨在以开源的方式提供一个可借鉴的解决方案,同时也展示了易语言在多线程编程方面的应用能力。 最后,文件名称列表中提到的"线程池.e"和"鱼刺类.多线程6.ec"文件,可能分别包含了易语言的源代码文件和编译后的执行文件。通过这两个文件,开发者可以进一步研究和实践线程池和多线程队列的实现机制,验证上述思路的实际效果。
2021-06-14 上传
这只是最简单的使用,后续如果热度高的话,再录个视频教程详解吧,学到的好评给一个~ 前  言 · 之前刚接触鱼刺的时候发了个 【鱼刺线程池,自动换IP,队列重试框架(https://bbs.125.la/forum.php?mod=viewthreadtid=14178530 )】 发现热度还不错,大家还是挺喜欢多线程的操作。 常言道:授人以鱼不如授人以渔,鱼刺类模块一直感觉确实稳定好用,对于新手来说一些命令还是比较难理解的。但不知道为什么一直没有详细教程。 今天趁这次开源大赛曾个热度 讲一下鱼刺多线程应用中 线程池Ex的使用方法,废话不多说,直接开始吧。 注: 所讲内容都是自己使用中所得出来的经验,如果讲的不好或者不对得地方请大佬指导哈。 已经请示过作者了: @Bints 首先我们需要下载并载入 教程以 鱼刺类_多线程应用5.43为主:鱼刺类_多线程应用v5.4.zip (112.11 KB, 下载次数: 228) 我们先来看看“鱼刺类_线程池Ex”的命令: 几个参数先说一下: 1.初始栈大小 :可以理解为申请内存的空间的初始大小(个人是这么理解的)。必须是4KB的倍数且最小8KB(8192字节)所以最小为8*1024,不用担心太少,任何情况下Windows会根据需要动态延长堆栈的大小 2.是否在UI线程 :如果填写了真,那么在循环里面会加个"处理事件()"的命令来让消息循环 去队列处理窗口组件操作 防止执行的时候窗口卡死,(记得在哪里看到过线程中处理事件()是没有效果的。不太懂~~) 1. 置_初始栈大小()  设置初始栈的大小,也可以在创建()的第五个参数中设置。此命令可以在线程池工作中设置。 2. 置_空闲回收事件()  设置线程空闲回收的时间,也可以在创建()的第三个参数中设置,此命令可以在线程池工作中设置。 3. 置_最大线程数()  设置最大线程数量,也可以在创建()的第二个参数中设置,此命令可以在线程池工作中设置。 4. 创建() :顾名思义 创建线程池。 5. 投递任务() ,向线程池中投递一个可执行的函数子程序指针,和投递任务_int()基本一模一样,在内部自动转换成指针地址到整数(子程序指针) 6. 投递任务_int()  向线程池中投递一个可执行的函数指针地址 7. 等待任务动态()  :就是等待线程,到指定的等待时间才会往下执行,可以用 触发任务动态来取消等待。 8. 触发任务动态() .这个需要和等待任务动态一起用,也可以理解为 放弃等待中的任务 继续向下执行 9. 暂停()  暂停正在工作的线程,配合 事件_暂停() 使用效果最佳,后续会详解。 10. 事件_暂停()   需要配合暂停命令。如果系统发出了暂停命令返回假 如果正常工作返回真,如果正在销毁的话也会返回假。 11. 继续()  取消暂停。 12. 取_队列任务数()  获取队列中的正在执行的线程数量。 13. 取_空闲任务数()  获取队列中的空闲线程数量,严格控制线程数量可以用到此命令,后续会详解。 14. 取_是否空闲()  获取线程池状态是否彻底空闲,也就是说任务是否全部执行完毕,可以作为后续投递任务完任务后的判断。 15. 取_线程池容量()  获取线程池的可执行的最小线程数量 16. 取_最大线程容量()  获取线程池中可执行的最大线程数量 17. 取_执行线程数()  获取正在工作的线程数量 18. 取_状态()  获取线程正在工作的状态,返回值为常量中的: #线程池_未启动 #线程池_正在工作,#线程池_正在销毁,#线程池_正在创建 下面开始实战,将会用到所有线程池Ex中的命令 首先载入模块后在程序集变量中创建一个线程池Ex。 创建一个按钮。在按钮事件中写入:要执行的任务数量为1000 线程数量为50 如果已知 执行数量为1000了 直接计次循环 写下去可能执行不够准确,因为不排除会投递失败的情况。所以我们: 如下图:只有在投递任务成功的时候 计次才会递增。 但是每次循环都会判断 递增的计次是否小于任务数量, 如果小于就继续执行,如果大于就说明投递的任务数量已经达到了目标任务数,就可以跳出循环了 上图中:投递任务()命令 传递了两个参数 一个是局_计次 一个是 0, 投递 局_计次 可以在任务函数中获取到 用处也比较大,比如可以用作超级列表框的索引。(前提是已经插入了) 等待任务动态().为什么要等待呢,又是时候你投递的是内存指针,投递进去后等待 任务函数将它获取到并释放完毕后触发任务动态就好了 比如: 这样看着没什么问题 是吧~~ 内存方面的知识后续再说把 先掠过,只是这样演示这节只讲线程池Ex 但是如果我们模拟一下真是线程场景 加个延时() 如上图所示,如果有延时的话线程池投递完任务直接销毁 会导致任务被中断,或者放弃了