微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么试图打开产生大量线程的TOpenDialog?

我有一个非常简单的forms与一个TOpenDialog和一个button。 当我按下button时,它会在对话框中调用Execute。 如果我在debugging器中观察,打开对话框的行为会产生类似14个线程的行为,并且当我closures对话框时它们也不会消失。

任何人有任何想法是怎么回事?

如何使我的delphi5应用程序显示密码“斑点”?

如何正确使用文件映射并将数据传递给subprocess?

是否有可能从应用程序访问内存到另一个? 怎么样?

如何识别应用程序意图执行运行文件

如何使用Delphi列出蓝牙无线电/设备?

想象一下,你想向你的朋友展示太平洋西北地区是多么美丽。 你决定出发去拍一些太平洋上的日落照片。 你真正关心的是图像文件回家的路上,他们可以上传到Facebook。 实际上,相机,镜头和三脚架需要在奥运会上被拖回来。 您还需要带摄影师(您自己)谁将设置相机,并按下快门。 摄影师需要在相对舒适的环境下移动,因此您可以坐在摄影师的座位上休息。 这个座位是封闭在一个闪亮的金属盒子,其他一些金属,玻璃和橡胶部分,其中一些正在转动和往复。 最后,大约两吨的东西(还有一个活着的人)花了几个小时的行程,焚烧加仑的碳氢化合物液体 – 目的是将一些信息从岸上移动到互联网。

与您的应用程序完全相同的事情发生。用户想要使用“打开文件”对话框打开文件时,用户希望能够:

导航到包含该文件的目录(该目录可能位于本地硬盘驱动器或CD / DVD / BR或网络驱动器或存档等中。介质可能是加密或压缩的,需要以不同的方式显示介质。插入,为此可能需要提示用户,媒体可能需要用户的证书,必须要求)。

使用URI / UNC连接到一个新目录(映射驱动器);

在目录中搜索一些关键字;

复制/删除/重命名一些文件;

看到该目录中的文件列表;

预览目录中每个文件内容;

选择打开哪个文件;

改变他/她的想法,并决定不打开文件;

做许多其他文件相关的事情。

操作系统可以让所有的这些事情发生,实质上是给你的进程大部分的Windows资源管理器功能 其中一些必须在后台进行,否则用户会抱怨“打开文件”对话框的反应迟钝。 在后台运行一些任务的明显方法是在不同的线程上运行它们。 所以这就是我们所看到的。

留下的线索怎么样,你问? 那么,他们中的一些人留在那里,用户将决定打开另一个文件:这种情况下节省了大量的时间,流量和打字。 上次用于这个特定进程的自定义身份验证? – 存储。 那些讨厌的PDF的预览图标? – 还在那儿。 目录中每部电影的长度和比特率? – 仍然可用,不需要重新解析它们。

当然,线程本身并不是神奇地出现的。 检查有多少个DLL已被映射到进程中。 看看他们中的一些人可以得到一个相当有趣的图片添加了什么功能

另外一个有趣的方法就是在创建每个线程的时候抛出这个调用堆栈。 这显示哪个DLL(有时是哪个对象)创建它们。 这是一个64位的Win7创建所有的线程。 人们可以找到资源管理器框架的线程被创建; 一些OLE活动将用于实例化文件过滤器,其中一些可以生成预览图标,覆盖图和工具提示; 少数属于搜索子系统的线程; shell的设备枚举器(所以如果用户插入一个新的设备,它会自动出现在打开的对话框中)。 shell网络监视器(同上)等东西。

好消息是它发生得很快,不会给你的过程增加太多的开销。 大多数线程花费大部分时间来等待一些很少的事件(比如插入USB钥匙),所以cpu不会花费任何时间执行它们。 每个线程在您的进程中占用1MB的虚拟地址空间,但实际物理内存只有几个4Kb页面。 而且大多数,如果不是所有这些DLL都没有使用任何磁盘带宽加载:他们已经在RAM中,所以他们只是被映射到你的进程几乎免费。

最终,用户一个活泼的用户界面中获得了大量有用的功能,而这个过程只需要做很少的事就可以实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐