精易论坛

标题: 分享关于许可证里面的坑 [打印本页]

作者: 吃泡面加不起蛋    时间: 2022-3-21 17:01
标题: 分享关于许可证里面的坑
本帖最后由 吃泡面加不起蛋 于 2022-3-22 12:37 编辑

感觉这次是理清楚思路了。

先解释许可证,以挖掘机为例。
两个挖掘机同时挖一个坑的时候,不进行限制,可能会撞。可使用许可证进行限制,必须拿到许可证,才可以挖,这样就可以保证安全。


========================
理想中的许可证。

1个许可证,AB同时想挖,A挖掘机先拿到,A就可以挖坑,此时B需要等待
A放回去以后,B拿到了,B就可以挖,挖完放回去

1个许可证,A放回去以后,A又想挖,AB又开始抢,AB谁拿到是随机的,并不是一定是B


========================
多个许可证的锁死,以2个为例。

2个许可证,如果A先拿许可证1,再去拿许可证2,然后才能工作,而B先拿许可证2,再去拿许可证1,然后才能工作
这时候就可能出现A拿着许可证1等许可证2,B拿着许可证2等许可证1,许可证冲突锁死了。


通常情况下不是我们故意要锁死,一般是先调用了许可证1,又调用了另一个子程序,另一个子程序调用了许可证2,而许可证2被忽视掉了。

========================
1个许可证的特殊情况,涉及执行UI操作(UI就是界面):
UI是一条单独,特殊的线程。执行是按顺序执行的。

所以如果有一个线程A 进入许可区,操作组件,退出许可区。又有一个按钮操作,点击后 进入许可区,操作组件,退出许可区。
两个同时进行,也可能发送锁死。

分析如下:
线程A先拿住许可证,
此时刚好按钮操作,需要许可证,就在此处等待。
A继续执行,下一步操作组件,但是操作组件需要等其他组件操作完成才可以,所以这里会等按钮操作。
按钮等许可证,线程A拿着许可证等按钮,锁死了。


这种情况很少遇到,遇到后又很难找到原因,因为明面上只有一个许可证。
处理方法可以全改为线程,点击按钮,启动一个线程,在线程里进入许可证。退出许可证。
嫌麻烦的话,也可以 许可证.尝试进入,进入失败,就 处理事件(),让其他线程先执行。

线程操作UI卡死例子.e (31.05 KB, 下载次数: 292)


作者: Suky    时间: 2022-3-21 17:23
很不错,可以给你的泡面加半个蛋
作者: 判断    时间: 2022-3-21 17:35
一路生花 发表于 2022-3-21 17:23
很不错,可以给你的泡面加半个蛋

加点酸菜
作者: Suky    时间: 2022-3-21 17:42
1013424156 发表于 2022-3-21 17:35
加点酸菜

土坑酸菜?
作者: 就是那个秋    时间: 2022-3-21 20:24
        新技能已get√
作者: kantal    时间: 2022-4-14 10:26
新技能已get√
作者: fjgh    时间: 2022-4-14 13:02

作者: 选马的人    时间: 2022-5-4 00:11

作者: 选马的人    时间: 2022-5-4 00:11
{:7_456:}{:7_456:}{:7_456:}
作者: changlinnan1    时间: 2022-6-22 11:05
手动阀手动阀
作者: changlinnan1    时间: 2022-6-22 11:07
啊实打实的
作者: 王摇摆    时间: 2022-7-6 20:37
感谢分享
作者: 爱易编程    时间: 2022-8-25 18:02
谢谢粉刺昂只是
作者: 157800148    时间: 2022-8-26 13:59
正好在搞多线程 ,感谢分享
作者: liuziang    时间: 2022-8-29 09:55
我需要这个 感谢
作者: liuziang    时间: 2022-8-29 09:56
必须感谢哦!!谢谢你
作者: a623539929    时间: 2022-11-5 07:50
谢谢分享了
作者: 阿橙阿    时间: 2022-11-9 17:57
感谢分享
作者: xiaomidi188    时间: 2022-11-12 09:42
用尝试进入 时间久了一样卡ui
作者: 吃泡面加不起蛋    时间: 2022-11-12 11:48
xiaomidi188 发表于 2022-11-12 09:42
用尝试进入 时间久了一样卡ui

判断循环首(许可证.尝试进入()=假)
处理事件()
判断循环尾

卡住的话,只能说明你方法不对。
或者我的方法有问题,你自己再想办法
作者: xiaomidi188    时间: 2022-11-12 11:54
吃泡面加不起蛋 发表于 2022-11-12 11:48
判断循环首(许可证.尝试进入()=假)
处理事件()
判断循环尾

等我试个方法 再回来说下
作者: xiaomidi188    时间: 2022-11-12 12:09
吃泡面加不起蛋 发表于 2022-11-12 11:48
判断循环首(许可证.尝试进入()=假)
处理事件()
判断循环尾

用标签反馈的方法可以 直接无脑多线程调用
作者: 吃泡面加不起蛋    时间: 2022-11-12 12:51
xiaomidi188 发表于 2022-11-12 12:09
用标签反馈的方法可以 直接无脑多线程调用

写着太麻烦,还要跳转来跳转去。除非一开始就用标签,后面再想改就太麻烦了
作者: xiaomidi188    时间: 2022-11-12 12:52
吃泡面加不起蛋 发表于 2022-11-12 12:51
写着太麻烦,还要跳转来跳转去。除非一开始就用标签,后面再想改就太麻烦了 ...

改的工程量确实是很头疼...

作者: 56859158    时间: 2023-1-22 20:08
必须感谢哦!!谢谢你
作者: Loyal2014    时间: 2023-2-14 18:31
感谢分享
作者: 603007856    时间: 2023-4-3 19:42
6666666666666
作者: 人杰啊    时间: 2023-4-20 14:06
感谢 插件写的出问题了 搜了一下看了你的方法果然有用
作者: 3800150    时间: 2023-6-10 06:26

作者: 3800150    时间: 2023-6-10 06:26
动阀手动阀
作者: 一米阳光2    时间: 2023-7-12 15:24
正在经历这些坑
作者: 一米阳光2    时间: 2023-7-12 15:24
不够精币哦,再来顶一下
作者: 373633406    时间: 2023-8-1 10:49

作者: jianfei86    时间: 2023-9-26 11:43
学习一下,谢谢
作者: heiioxiaojian    时间: 2023-9-27 16:19
支持开源~!感谢分享
作者: 地师再现    时间: 2023-10-14 23:40
好好学学
作者: 9281    时间: 2023-12-19 20:08
学会了 解决了问题非常感谢
作者: zjsky08    时间: 2024-2-1 14:13
支持开源~!感谢分享
作者: aosheng    时间: 2024-11-17 20:46
6666666666666666666666
作者: q3486    时间: 2025-6-16 18:54
        感谢分享,很给力!~




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4