511遇见易语言多线程大漠多线程-17多线程启动方式许可证

易语言线程许可证

一、许可证
1、E语言也叫做许可证 = 锁

2、一般用许可证是在多个线程要同时写一个集变量或全局变量才或部分组件的读写

3、不要毫秒级的频繁的操作某些个组件,

4、 基本原则是,任何组件都不要多线程操作。除非,你能确保他不会同时操作!

5、无论是那种语言的界面组件,频繁的操作组件,不是界面假死,就是崩溃,真的死掉

6、原则上来说,界面组件只是展示数据的,不是存储数据的。如非必要,不要频繁的去读取和修改

7、可用数组存储起来,多线程中根据索引操作数组,数组改变时,同步列表就好了

8、用多了许可证等于失去了多线程优势

9、许可就可能比不用线程还慢,因为多了加锁和解锁的过程

10、某些个组件,加了许可证,也不见的能长时间稳定

11、可以把组件内容读到内存,程序集变量和全局变量加上许可

12、许可证并不是针对线程的,也不是针对某个变量的,而是本身就是个独立的全局变量,他就是自己孤零零的摆在那,只起到一个开关的作用。

13、许可区

1、许可区(一般称为临界区),不论是硬件许可资源,还是软件许可资源,多个线程必须互斥地对它进行访问,每个线程中访问许可资源的那段代码称为许可区。
2、注意事项:

①、如果有若干线程要求进入许可区,一次仅允许一个线程进入;
②、任何时候,处于许可区内的线程不可多于一个。如已有线程进入自己的许可区,则其它所有试图进入许可区的线程将被挂起,并一直持续到进入许可区的线程退出;
③、进入一个空闲的许可区时,耗时极少,但是进入一个需等待的许可区时,耗时相对较长,因此需要避免经常出现进入需等待的许可区;
④、创建后许可区,在不再使用时,需要将其删除;
⑤、在使用许可区时,应尽量减少许可区内代码,避免使用需长时间处理的代码,使进入许可区的线程能尽快退出,以便其它线程能进入许可区;
⑥、避免将整个线程处于许可区内,尽管它不会出错,但是由于后来要求进入许可区的线程全部会被挂起,也就会出现虽然是多线程,但实际是以单线程方式执行;
⑦、访问相同的许可资源时,必须是以相同的许可区进入访问,以不同的许可区进入访问将可能会使许可区变的无意义(我在这个坑里蹲了很久,郁闷啊!)。
3、许可区缺点
①、无法侦测某个许可区是否可进入。
使用处理事件()。非窗口的线程是没有窗口消息循环,而处理事件()命令是用于消息循环,因此在非窗口的线程上是不必加入“处理事件()”命令;

1、线程中的许可证,是对一些资源的保护,避免在多线程中的冲突,但在你的程序中,你在线程一启动就进入许可区,那么将导致后启动的线程在前一个线程没有退出之前,将一直处于等待状态,也就是说你启动了多个线程只相当于启动一个线程。

2、线程中没有消息循环,所以没有必要在线程中加入“处理事件()”;

3、多线程一般是可以看作各线程是同时运行的,但是相同的代码不一定执行的时间就相同。

教程源码:

.版本 2
.支持库 EThread
 
.程序集 窗口程序集_启动窗口
.程序集变量 许可证, 整数型
.程序集变量 x, 整数型
 
.子程序 __启动窗口_创建完毕
 
许可证 = 创建进入许可证 ()
 
.子程序 _按钮1_被单击, , , 启动线程
 
启动线程 (&子程序1, , )
启动线程 (&子程序2, , )
 
.子程序 子程序1
 
' 进入许可区 (许可证)
.计次循环首 (20, )
    进入许可区 (许可证)
    x = x + 1
    编辑框1.加入文本 (到文本 (x) + #换行符)
    退出许可区 (许可证)
.计次循环尾 ()
' 退出许可区 (许可证)
 
.子程序 子程序2
 
' 进入许可区 (许可证)
.计次循环首 (20, )
    进入许可区 (许可证)
    x = x + 1
    编辑框2.加入文本 (到文本 (x) + #换行符)
    退出许可区 (许可证)
.计次循环尾 ()
' 退出许可区 (许可证)
 
.子程序 __启动窗口_将被销毁
 
删除进入许可证 (许可证)


发布日期:

所属分类: 易语言 标签: