易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

鱼刺多线程模块例程   [复制链接]

    2024-05-10 10:19:58
    进阶教程源码
    易语言资源网
    1630 次浏览
    来源链接

今天当醒老师

写在前面,因为感叹多线程的魅力,所以把鱼刺大佬的模块都写了简单通俗的例子

我觉得,所有人,包括新手,都能看懂

详细代码注释 23个例程,覆盖95%以上的类的基本使用方法

没学明白的也可以来学

没有视频,因为时间不够...今晚是挤出来的

很感谢论坛大佬们的开源,每个人应该都是不断看别人代码学习、进步的吧

可能算重复轮子...不过能把鱼刺模块抛出来,引起大家的学习动机

学完之后,换上英特尔芯片体验多线程吧...

动手操作一下吧,不然不是自己掌握的东西

目录

0A 线程池

        ' 新手快来看看线程池的基本例子吧

        ' 如果按顺序执行一个循环,界面是不是会卡死,动不了?

        ' 你可以在循环里面加 处理事件()

        ' 但是拖动窗口的时候依然会卡

        ' 怎么办呢?

        ' 开线程!

        ' 请看 实例【17. 线程操作】

        ' ...

        ' 好了,现在,假设你看完了,

        ' 如果不开线程,那么,每个任务必须等待前一个任务完成后才能开始

        ' 现在开了一个线程,是不是就不占用窗口绘制了,你的鼠标可以干你的事情,你的任务在后台慢慢跑

        ' 那么我是不是可以在后台开多个线程呢?

        ' 可以,请看线程池

        ' 假如有100个任务,但是你的服务器配置很拉,只能开4个线程

        ' (线程不是越多越好,一般看CPU核心数,Windows系统下,任务管理器-性能-逻辑处理器)

        ' 那我就创建一个管理线程的工具,它叫线程池

        ' 这个时候,100个任务就在后台并发执行了

        ' 线程池,启动

0B. 队列

        ' 队列。就是有一只队伍,按照队伍排队顺序,依次执行

        ' 鱼刺类队列是线程安全的,也就是说,多线程里面,可以直接调用

        ' 现在的实例是:假如有1000个任务,但是你的服务器只能开4个线程(配置很拉)(线程不是越多越好,一般看CPU核心数,Windows系统下,任务管理器-性能-逻辑处理器)

        ' 这些任务呢,不可以直接传进线程里面,那就用队列。

        ' 先把1000个任务放进队伍里面,然后让这四个线程按自己的能力去分配

0C 线程池 - 实例2

1. 临界许可1

        ' 临界许可第一个用法,线程排队执行

        ' 某种情况下,所有线程不能并发执行,必须排队执行。

        ' 也可以用队列,在不方便使用队列的情况下,可以用这个临界许可

2. 临界许可2

        ' 临界许可第二个用法,防止资源访问冲突

        ' 多个线程同时修改程序集变量、全局资源,需要加锁,也就是写锁。

        ' 这时候用临界许可,在防止资源访问冲突的情况下,临界许可范围要写得很窄,提高允许效率

        ' 某些情况下(访问类、或者全局),需要加读锁,有时候不加可能会导致崩溃。

3. 哈希表 快速去重、查重、查表

        ' 哈希表是一种结构。通俗一点,通过一个数学函数,将一个东西变成一串代码,这个运算是非常快的,而且每个东西对应的代码都不一样

        ' 然后通过一系列操作,可以用在查重、去重上面

        ' 也包括,类似数据库里面的cha询,查表

4. 定时器队列

        ' 顾名思义,创建多个线程,这些线程排队执行,而且是延迟执行的

5. 定时器队列实例

        ' 网易云用过吧,播放列表,一首歌播完,接着下一首

6. 定长队列实例 定长栈

        ' 通俗地讲,一个队伍里面,只能有固定数量的人

        ' 所有人排成一队,新的人进来了,最前面的人就得出队

        ' 比如说,浏览器的历史记录,最多能装5条。再多了,内存就炸了

        ' 这个时候,你就得限制历史记录的数量

        ' 那我现在创建一个定长队列

        集_定长队列.创建 (5)  ' 数量为5

' 定长栈

        ' 先进后出,最先压入的成员,地位最难动摇,最后加进去的,一不小心就丢了饭碗

7. 鱼刺类_计时

        写个例子,用汇编加法和普通加法比较

8. 读写锁

        ' 读写锁跟临界许可类似,防止资源访问冲突

        ' 多个线程同时修改程序集变量、全局资源,需要加锁,也就是写锁。

        ' 这时候用临界许可,在防止资源访问冲突的情况下,临界许可范围要写得很窄,提高允许效率

        ' 某些情况下(访问类、或者全局),需要加读锁,有时候不加可能会导致崩溃。

9. 缓冲区

        ' 顾名思义,就是缓存,而且不能多线程用*(非线程安全)的缓存

       

10. 内存操作

        ' 内存操作,易语言的命令大部分有多次内存分配与释放

        ' 直接使用内存操作,加快速度

        ' 但你要确保内存安全hh,不能泄露,也不能读到非法内存

        ' 否则程序就崩

11. 内存共享

        ' 通俗地讲,就是两个程序之间发信息

        ' 用于跨进程的通信,通过内存映射,还有别的方法,论坛上开源有管道、socket。

       

12. 鱼刺类_时钟

        ' 普通定时器,跟易语言的一样

13. 事件

        ' 在多个线程中,事件是一种同步机制

        ' 让所有的线程都等待你的命令

        ' 这个命令可以是别的条件,不一定是你手动触发的,可以是代码触发的,比如今天下雨了才触发

        ' 比如多个线程可能需要等待某个初始化操作完成才能继续执行,可以使用事件来同步这些操作

14. 同步组

        ' 同步组与事件类似

        ' 在多个线程中,事件是一种同步机制

        ' 让所有的线程都等待你的命令

        ' 这个命令可以是别的条件,不一定是你手动触发的,可以是代码触发的,比如今天下雨了才触发

        ' 比如多个线程可能需要等待某个初始化操作完成才能继续执行,可以使用事件来同步这些操作

15. 完成端口

        ' 用于高性能IO操作的同步机制

        ' 将文件句柄、socket句柄等IO对象与之关联

        ' 线程可以通过完成端口来同时监控多个IO操作,而不需要为每个操作单独阻塞或轮询

16. 线程附加数据

        ' _附加数据 是程序集变量吧?也就是共享数据,对不对?

        ' 但是你看下面的例子,三个线程同时访问附加数据,得到的值都不一样

        ' 为什么?

        ' 虽然它是程序集变量,但是每个线程里面,它都有自己对应的副本,所以各个线程互不影响

17. 线程操作

        ' 就是创建一个线程...

        ' 和易语言的启动线程一样,不过功能肯定更强大

18. 信号量

        ' 信号量也是种同步机制

        ' 用来限制可以同时访问某个资源的线程数量

        ' 比如说,资源只有1份,但是有8个人去抢,看谁能抢到

        ' 那就用信号量

        ' 它可以跨进程

19. 原子锁

        ' 原子锁就是一个加了锁的共享变量

        ' 但是鱼刺模块只实现了整数型的

        ' 不过...大佬都说易语言整数型是万能的...

        ' 指针...

20. 什么时候不加读锁也可能会崩?

        ' 会导致程序崩溃的例子

        ' 不加读锁,可能不会出错,也不会崩

        ' 但是有几率出错!并且有几率崩溃!

        ' 如果一开始没报错,那就终止调试,再多调试几次

        ' 你会发现,一开始启动的时候是最容易出错的

        ' 可能是出错了,但是程序没崩

        ' 也可能是数组越界了,程序崩了

学习无价

2024/4/3 增加 [什么时候不加读锁也可能会崩?]



点我下载 (已有 137 次下载)

引用模块


源码文件名 模块文件名
0A. 线程池.e
鱼刺类.多线程6.ec
0B. 队列 - 实例.e
鱼刺类.多线程6.ec
0C. 线程池.e
鱼刺类.多线程6.ec
1. 临界许可1.e
鱼刺类.多线程6.ec
10. 内存操作.e
鱼刺类.多线程6.ec
11. 内存共享 1.e
鱼刺类.多线程6.ec
11. 内存共享 2.e
鱼刺类.多线程6.ec
12. 鱼刺类_时钟.e
鱼刺类.多线程6.ec
13. 事件.e
鱼刺类.多线程6.ec
14. 同步组.e
鱼刺类.多线程6.ec
15. 完成端口.e
鱼刺类.多线程6.ec
16. 线程附加数据.e
鱼刺类.多线程6.ec
17. 线程操作.e
鱼刺类.多线程6.ec
18. 信号量.e
鱼刺类.多线程6.ec
19. 原子锁.e
鱼刺类.多线程6.ec
2. 临界许可2.e
鱼刺类.多线程6.ec
20. 什么时候不加读锁也可能会崩?.e
鱼刺类.多线程6.ec
3. 哈希表类ZY.e
鱼刺类.多线程6.ec
4. 定时器队列.e
鱼刺类.多线程6.ec
5. 定时器队列 - 实例.e
鱼刺类.多线程6.ec
6. 定长队列 定长栈.e
鱼刺类.多线程6.ec
7. 汇编加法 鱼刺类_计时.e
鱼刺类.多线程6.ec
8. 读写锁.e
鱼刺类.多线程6.ec
9. 缓冲区.e
鱼刺类.多线程6.ec


引用支持库


源码文件名 支持库文件名 支持库标识
0A. 线程池.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
0B. 队列 - 实例.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
0C. 线程池.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
应用接口支持库 3.1 F7FC1AE45C5C4758AF03EF19F18A395D
1. 临界许可1.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
10. 内存操作.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
11. 内存共享 1.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
11. 内存共享 2.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
12. 鱼刺类_时钟.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
13. 事件.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
14. 同步组.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
15. 完成端口.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
16. 线程附加数据.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
17. 线程操作.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
18. 信号量.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
19. 原子锁.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
2. 临界许可2.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
20. 什么时候不加读锁也可能会崩?.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
3. 哈希表类ZY.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
4. 定时器队列.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
5. 定时器队列 - 实例.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
6. 定长队列 定长栈.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
7. 汇编加法 鱼刺类_计时.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
8. 读写锁.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
9. 缓冲区.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0


[错误报告]   上一篇:枚举连接列表&进程路径...     下一篇:C++API内存读写