windows – 为什么要打开一个产生大量线程的TOpenDialog?

前端之家收集整理的这篇文章主要介绍了windows – 为什么要打开一个产生大量线程的TOpenDialog?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个非常简单的表单,一个TOpenDialog和一个按钮。当我按下按钮时,它会在对话框中调用执行。如果我在调试器中看到,打开对话框的行为会产生一些像14个线程的东西,当我关闭对话框时,它们也不会消失。

任何人都知道发生了什么事情?

想像你想向朋友展示太平洋西北地区有多美丽。您决定开车去拍摄 sunset over the Pacific的几张照片。您真正关心的是图像文件回到家,他们可以上传到Facebook。实际上,摄像机,镜头和三脚架需要在 Olympics和后面被拖运。您还需要带上将照相机放置并按下快门的摄影师(自己)。摄影师需要在相对舒适的地方移动到这里,所以你坐下来,摄影师在旅途中休息。这个座椅被封闭在一个闪亮的金属盒子里,其中一些其他的金属,玻璃和橡胶件,其中一些是转动和往复运动的。最后,大约两吨的东西(和一个活着的人)进行多小时的旅行,燃烧了加仑的碳氢化合物液体,目的是将一些信息从岸边移到互联网。

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

>导航到包含文件的目录(该目录可能在本地硬盘驱动器或CD / DVD / BR或网络驱动器或存档等)。媒体可能被加密或压缩,这需要不同的显示媒体可能不插入,用户可能需要提示它们。媒体可能需要用户的凭据,必须要求);
>使用其URI / UNC连接到新目录(映射驱动器);
>搜索目录中的一些关键字;
>复制/删除/重命名一些文件;
>查看该目录中的文件列表;
>预览目录中每个文件内容;
>选择要打开的文件;
改变主意,决定不要打开文件;
>做许多其他文件相关的事情。

操作系统允许所有这些都通过基本上给您的进程大部分的Windows资源管理器功能发生。其中一些必须在后台发生,否则用户将抱怨Open File对话框无效。在后台运行某些任务的明显方法是在不同的线程上运行它们。这就是我们所看到的。

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

当然线程本身并不奇怪。查看有多少个DLL已经映射到进程中。看一些他们可以得到一个有趣的图片添加了什么功能

查看它的另一个有趣的方法是在每个线程创建时转储调用堆栈。这显示了哪些DLL(有时是哪个对象)创建它们。 Here’s x64 Win7如何创建所有线程。可以找到Explorer框架的线程创建;一些OLE活动将用于实例化文件过滤器,其中一些可以生成预览图标,叠加和工具提示;属于搜索子系统的几个线程; shell的设备枚举器(所以如果用户插入新设备,它会自动出现在打开的对话框中);外壳网络监视器(同上)等。

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

最后,用户在一个快速的UI中获得了很多有用的功能,而该过程不得不做很少的事情来实现所有这一切。

猜你在找的Windows相关文章