精易论坛

标题: 求一个 信号量 许可证的区别详解 [打印本页]

作者: 天河宇    时间: 2025-6-20 13:10
标题: 求一个 信号量 许可证的区别详解
最近写了一个程序,多线程+许可证是没问题的,但是我有时候是直接调用,没在线程内,会随机奔溃,例子如下:


在线程内调用是没有问题的,但是有时候会手动点击按钮调用一下,就会随机崩溃。

由此有两个问题
1. 许可证是否必须要在线程内使用
2. 如图示,许可证套许可证的形式是否有问题




补充内容 (2025-6-20 13:11):
忘了第三个问题,信号量和许可证的区别
作者: 洋Hay    时间: 2025-6-20 13:10
1. 许可证在UI线程内无效, 或这样说主线程内无效. 所以导致你这些写代码会崩溃. 如果你再主线程内使用的许可证, 易语言默认这个许可证不会阻塞.
2. 许可证套许可证的形式没问题.
3. 区别挺多, 简单来说,信号量能阻塞UI线程, 许可证不能阻塞UI线程 , 一般正常来说, 程序都不要阻塞UI线程, 如果要阻塞, 请重新重新设计代码流程.
作者: 恶魔の佐翼    时间: 2025-6-20 13:20
许可证没必要整个都用,只需要在变量写入的时候用下,你看下哪个变量给赋值了用下就行......不是整个代码都需要用.....
作者: 天河宇    时间: 2025-6-20 13:27
恶魔の佐翼 发表于 2025-6-20 13:20
许可证没必要整个都用,只需要在变量写入的时候用下,你看下哪个变量给赋值了用下就行......不是整个代码都需 ...

我的设计逻辑是这样的,这条程序必须单独跑完了其他线程的程序才能跑,所以就加在程序收尾了,是不是可以用别的方式替代?
作者: 恶魔の佐翼    时间: 2025-6-20 13:32
天河宇 发表于 2025-6-20 13:27
我的设计逻辑是这样的,这条程序必须单独跑完了其他线程的程序才能跑,所以就加在程序收尾了,是不是可以 ...

你这样还不如不用线程,你这跟直接调用没区别了.............
作者: 天河宇    时间: 2025-6-20 13:47
恶魔の佐翼 发表于 2025-6-20 13:32
你这样还不如不用线程,你这跟直接调用没区别了.............

我的意思是,所有线程都调用了某个子程序,但是A线程的这个子程序必须完整运行一次以后,B线程才能再次调用这个子程序,于是加许可
作者: 恶魔の佐翼    时间: 2025-6-20 15:40
天河宇 发表于 2025-6-20 13:47
我的意思是,所有线程都调用了某个子程序,但是A线程的这个子程序必须完整运行一次以后,B线程才能再次调 ...

是啊,直接调研的话也是先调用跟后调用啊,主线程只能一个一个调用的,你这加了个许可证整个代码那还不如直接调用来的实在..............
作者: 天河宇    时间: 2025-6-20 16:23
恶魔の佐翼 发表于 2025-6-20 15:40
是啊,直接调研的话也是先调用跟后调用啊,主线程只能一个一个调用的,你这加了个许可证整个代码那还不如直 ...

你要不要再看看我说了什么,每个线程都调用那个子程序C的话,理论上子程序是可以叠加运行的,A线程运行子程序C的同时B线程也在运行子程序C,我需要的是A线程运行子程序C的时候如果B线程也在运行子程序C,那就阻塞,直到A线程的子程序C执行完毕
作者: 天河宇    时间: 2025-6-20 16:29
洋Hay 发表于 2025-6-20 15:49
1. 许可证在UI线程内无效, 或这样说主线程内无效. 所以导致你这些写代码会崩溃. 如果你再主线程内使用的许 ...

说到点子上了,我就是线程里调用子程序,子程序里有许可证,线程调用子程序完全没问题,通过菜单按钮调用子程序就会出现概率崩溃,那么问题就出在主线程使用许可证了,是不是换信号量就可以了?
作者: 洋Hay    时间: 2025-6-20 19:22
天河宇 发表于 2025-6-20 16:29
说到点子上了,我就是线程里调用子程序,子程序里有许可证,线程调用子程序完全没问题,通过菜单按钮调用 ...

嗯.换信号量可以,但是不建议在主线程上阻塞, 建议你在主线程上,开一个指定线程改变变量,毕竟有什么bug的产生, 主线程被阻塞,就导致程序没法响应.

补充内容 (2025-6-20 19:27):
就是主线程临时创建一个线程,调用你的子程序.




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