精易论坛

标题: 精易模块_关于线程的BUG [打印本页]

作者: Mr.Yang    时间: 2015-7-8 17:17
标题: 精易模块_关于线程的BUG
本帖最后由 萧阳天 于 2015-7-8 18:52 编辑







旧版命令是精易模块现在在用的. 新版的是我自己修改的

旧版命令申请到句柄之后 下次再启动线程不会释放之前的句柄 而是继续累计.在多线程或者线程循环的环境下影响很大.长期运行的结果不言而喻.

例子.zip (21.4 KB, 下载次数: 4)


作者: 村雨    时间: 2015-7-8 17:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: 喵娘    时间: 2015-7-8 17:42
不用多线程好多年

作者: ds9660    时间: 2015-7-8 18:49
使用方法不对。
如果你在启动线程的时候关闭了句柄,那么后续对该线程的挂起、恢复等操作都没有办法进行了。

正确的使用方法是

线程_关闭句柄(线程_启动(&子程序))
作者: 萧阳天    时间: 2015-7-8 18:52
CreateThread  创建的线程返回线句柄正常情况下用CloseHandle是内核减1操作,并不会影响线程正常执行,但返回的线程句柄还有其它操作,如 挂起、设置优先级等都需要内核句柄
作者: qq780571    时间: 2015-7-8 19:32
萧阳天 发表于 2015-7-8 18:52
CreateThread  创建的线程返回线句柄正常情况下用CloseHandle是内核减1操作,并不会影响线程正常执行,但返 ...

为什么没有针对精易模块里面子程序的使用例程?你看连高手都会出错。。。
作者: Mr.Yang    时间: 2015-7-8 19:41
萧阳天 发表于 2015-7-8 18:52
CreateThread  创建的线程返回线句柄正常情况下用CloseHandle是内核减1操作,并不会影响线程正常执行,但返 ...

别人提交的参考型的句柄参数 那就代表原来的句柄是对他没用的 他才覆盖原来的句柄.

如果打算覆盖句柄的话 那么之前的句柄就已经肯定是没用的了 那不删除有什么用呢?

CloseHandle之后 线程还会继续执行 那么就不会影响中途还在运行的线程.

一举两得 为什么不这样修改呢?
作者: Mr.Yang    时间: 2015-7-8 19:44
ds9660 发表于 2015-7-8 18:49
使用方法不对。
如果你在启动线程的时候关闭了句柄,那么后续对该线程的挂起、恢复等操作都没有办法进行了 ...

关闭句柄命令这个也是我提出的.

原本的精易模块是不存在这个命令 是叫做销毁

句柄=启动线程(&XX)

既然用户打算覆盖句柄的话 那么原来的句柄对他来说已经是没有操作的意义的.那么不删除有什么用呢?

CloseHandle之后并不会对正在执行的线程有影响 这样一举两得 为什么不好呢?
作者: 无阻    时间: 2015-7-8 19:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: 御风软件    时间: 2015-7-11 19:23
囧,不知道这个线程句柄计数有什么影响,你看你截图的那个91的,50337,5万多句柄。。。

作者: 御风软件    时间: 2015-7-11 19:35
萧阳天 发表于 2015-7-8 18:52
CreateThread  创建的线程返回线句柄正常情况下用CloseHandle是内核减1操作,并不会影响线程正常执行,但返 ...

他的本意应该是线程执行完成了,调用CloseHandle,减少句柄数
因为,CreateThread  不管你是否接收,都会产生一个句柄的

但是,他这个实现也不算好,也不见得有什么用,就为了单纯的减少句柄计数
要知道,他的意思是说大量循环的,那么如果是大量循环,那你要自己弄个数组来保存句柄
不然,你一个循环,不断的创建线程,你那里知道那个线程执行完成了呢?就启动一条就关闭上条?
所以,这本来就是得不偿失的东西。。。我想一般人也不会为了这样去做更多的东西。。。

虽然我不懂那个句柄数是什么算的,如果他只是一个整数,单纯的+1,-1来算的呢?
那么,他可以保存32亿的次数,所以,无论是1还是最大值,他永远也只占用你4个字节的内存而已
作者: Mr.Yang    时间: 2015-7-11 19:49
御风软件 发表于 2015-7-11 19:35
他的本意应该是线程执行完成了,调用CloseHandle,减少句柄数
因为,CreateThread  不管你是否接收,都 ...

在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。

这个不像内存溢出 短时间内是不会对软件造成影响的 但是长时间运行或者频繁调用会导致软件的崩溃 就比如我说的多线程或者线程循环 影响很大.

至于你说的91他运行后就是五万句柄的 后面长时间运行并不会增长.但是按照现在的线程漏洞会无止境增长.

我现在已经找到比这个更好的方法解决这个问题了_我也是出于对模块的支持而提出的意见.采纳与否还是模块更新人员决定 我尊重他们的意向.
作者: 御风软件    时间: 2015-7-11 20:40
Mr.Yang 发表于 2015-7-11 19:49
在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1 ...

我就是不知道,他那个句柄数,是单纯的计数,还是保存了线程返回的句柄的一个队列
线程执行完成了会自己销毁的,如果是保存了句柄,那就是保存了无用的句柄,但是不会使用到呀
如果是,单纯的奇数,就不会有任何的影响,而现在,我觉得,他那个应该不是单纯的计数
因此,保存了这么多的整数型的句柄,那应该会多占用一些内存。。。就这个影响而已
其实,就算是真正的保存了那么多句柄,那应该也只是个标记,在进程关闭的时候进行清理
那么,对软件来说,是不算什么影响的,影响的只是用户电脑,关闭软件要把标记的对象清理

所以,我觉得这个影响不大呀,用户自己处理,就要不用一个对象,就自己去CloseHandle来删除一个
如果不处理,在软件关闭的时候,系统自动的去把全部的对象,CloseHandle来删除掉
如果不是对内存,CPU很苛刻的,这完全不需要自己去处理,就是浪费了些内存而已。。。

作者: Mr.Yang    时间: 2015-7-11 23:38
御风软件 发表于 2015-7-11 20:40
我就是不知道,他那个句柄数,是单纯的计数,还是保存了线程返回的句柄的一个队列
线程执行完成了会自己 ...

任务管理器显示的句柄数不仅仅是计数 而是代表现有的句柄数量.

不及时关闭的话_句柄覆盖之后就没办法再进行释放了.从而会申请了很多无用的句柄.

问题我已经明确指出了.句柄无限制增长到最后只会使软件出错.

虽然有部分人懂如何处理.但是大多数新手完全不会,我已经遇到无数个这样的求助例子.

我发上来的这个是随手写的 的确有瑕疵. 后来我又重新做了一个更完善的版本.
这个帖子不用再回复了





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