递归火山软件开发平台

标题: 求问 多线程要怎么关闭 [打印本页]

作者: filippo009    时间: 昨天 01:21
标题: 求问 多线程要怎么关闭
根据论坛的, 启动线程,采用了取文本指针()传递了参数,在E 里面有个 关闭线程句柄,请问火山这种 要怎么处理 ,不关闭 会有什么影响呢?


<火山程序 类型 = "通常" 版本 = 1 />
xxd2 = 新代码 + "#" + 到文本 (d2)                   // 传递参数
pd2 = 取文本指针 (xxd2)

xxd1 = 新代码 + "#" + 到文本 (d1)                  // 传递参数
pd1 = 取文本指针 (xxd1)

启动线程 (获取数据2, pd2, , , )
延时 (50)

启动线程 (获取数据1, pd1, , , )

延时 (150)



作者: Xelloss0618    时间: 昨天 12:06
一、启动线程内部已经写了关闭线程句柄,所以无需关闭句柄,线程执行完就会销毁;
但相应的,你也不能对线程句柄进行操作,但线程句柄的操作很多是不安全的,也没所谓了。

二、你传参局部变量的指针,在线程里会变成野指针的,这也是为什么你加了个延时。
建议申请内存,将数据复制到内存里,再在线程中调用并释放内存。
如果觉得比较麻烦,也可以用PIV模块的启动静态线程,支持传递任意类型和数量的参数,而且默认是按值拷贝参数的数据,不需要考虑句柄变量的问题。
作者: filippo009    时间: 昨天 13:57
Xelloss0618 发表于 2025-10-26 12:06
一、启动线程内部已经写了关闭线程句柄,所以无需关闭句柄,线程执行完就会销毁;
但相应的,你也不能对线 ...

哪种速度上更快一些
作者: Xelloss0618    时间: 昨天 15:36
filippo009 发表于 2025-10-26 13:57
哪种速度上更快一些

性能差距在1微秒内,可以忽略不计了,哪个方便用哪个
作者: filippo009    时间: 昨天 20:17
Xelloss0618 发表于 2025-10-26 15:36
性能差距在1微秒内,可以忽略不计了,哪个方便用哪个

谢谢你,  野指针容易丢包吗..是申请内存方式和 PIV模块相差不大的意思吧 ?
作者: Xelloss0618    时间: 昨天 22:03
filippo009 发表于 2025-10-26 20:17
谢谢你,  野指针容易丢包吗..是申请内存方式和 PIV模块相差不大的意思吧 ?  ...

野指针的意思是指针原先指向的变量已经被销毁,现在的指针数据是不可靠的。
PIV模块里封装的是STL标准库的线程,和申请内存是有区别的,但都能实现功能,标准库的更强大一点,不限制参数类型和参数数量。
作者: filippo009    时间: 昨天 22:19
filippo009 发表于 2025-10-26 20:17
谢谢你,  野指针容易丢包吗..是申请内存方式和 PIV模块相差不大的意思吧 ?  ...

刚我重新 加载了PIV 模块,重新试试了下,由于我运行完线程,要返回一个数据,之前返回数据用的 数组类 .加入成员,启动线程后不延迟, 会导致数组的数据错位,要用数组方式,必须加延时
另外,我不用数组方式,给每个线程返回单独定义了了个变量,可以不用延时... 速度目前无法测试,到底跟以前比哪个快... 主观感觉,跟e写的速度差不多..
作者: Xelloss0618    时间: 昨天 22:23
本帖最后由 Xelloss0618 于 2025-10-26 22:25 编辑
filippo009 发表于 2025-10-26 22:19
刚我重新 加载了PIV 模块,重新试试了下,由于我运行完线程,要返回一个数据,之前返回数据用的 数组类 . ...

你是在线程里加入成员到外部的成员/全局变量里?
那就应该加锁啊,用互斥锁。
速度就不用纠结了,创建线程本身耗时就有几毫秒,PIV和启动线程的速度差距是1微秒内,相比之下这点开销不值一提。

作者: filippo009    时间: 昨天 22:39
Xelloss0618 发表于 2025-10-26 22:23
你是在线程里加入成员到外部的成员/全局变量里?
那就应该加锁啊,用互斥锁。
速度就不用纠结了,创建线程 ...

我是线程处理完数据,然后得返回到全局变量里,,还要回去再加工处理..
加锁 的话 我后面试试..
.. 请教一下,哪种不耗内存..?

原来e里面写的也加了延迟,只是e只能支持32位,现在要到64位,改火山..
就当学习一种新的方法,谢谢你,我是半吊子,纯搞一点点数据自己用
作者: Xelloss0618    时间: 昨天 23:11
filippo009 发表于 2025-10-26 22:39
我是线程处理完数据,然后得返回到全局变量里,,还要回去再加工处理..
加锁 的话 我后面试试..
.. 请教 ...

你加了延时,那肯定是最慢的。
就算是易语言,线程里操作全局变量也是靠加锁的。
你定义一个全局的互斥锁,然后无论是线程内部还是主线程,在操作全局变量之前都需要加锁,操作完也要立即解锁。
作者: filippo009    时间: 7 小时前
Xelloss0618 发表于 2025-10-26 23:11
你加了延时,那肯定是最慢的。
就算是易语言,线程里操作全局变量也是靠加锁的。
你定义一个全局的互斥锁 ...

我看了别人写的, 1种用了: 类_全局锁,然后 锁.进入许可..(但没找到这个 类_全局锁是)
另外一种 是互斥锁..  .加锁,解锁 方式....
再请教一下这个....
作者: Xelloss0618    时间: 6 小时前
filippo009 发表于 2025-10-27 08:23
我看了别人写的, 1种用了: 类_全局锁,然后 锁.进入许可..(但没找到这个 类_全局锁是)
另外一种 是互斥 ...

底层是一样的,不同封装的模块而已,互斥锁类是官方就有的,用这个就行。
作者: yb1984724    时间: 5 小时前
弄一个线程池吧,支持类传递
作者: 一代码农    时间: 3 小时前
@Xelloss0618
(, 下载次数: 0)
X大,请教一下,说到多线程,见如所示,火山的启动线程好像无法达到如图这种效果,据说是二次封装,如使用火山的启动线程,将等待结束设为真,好像和单方法差不多,并不会有如上效果,已亲测。
好像启动有状态线程才是标准的多线程方式,和这个方式类式,如上的等待线程需要使用同步事件或信号灯才可以实现类似效果,经我测试后还是没有如图上的效果好。


请X大解惑一下,如使用图上效果的话,用火山自带的多线程如何才能达到对应的效果。





欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4