任何人都知道发生了什么事情?
与您的应用程序完全相同的事情。当用户想要使用“打开文件”对话框打开文件时,用户希望能够:
>导航到包含文件的目录(该目录可能在本地硬盘驱动器或CD / DVD / BR或网络驱动器或存档等)。媒体可能被加密或压缩,这需要不同的显示媒体可能不插入,用户可能需要提示它们。媒体可能需要用户的凭据,必须要求);
>使用其URI / UNC连接到新目录(映射驱动器);
>搜索目录中的一些关键字;
>复制/删除/重命名一些文件;
>查看该目录中的文件列表;
>预览目录中每个文件的内容;
>选择要打开的文件;
改变主意,决定不要打开文件;
>做许多其他文件相关的事情。
操作系统允许所有这些都通过基本上给您的进程大部分的Windows资源管理器功能发生。其中一些必须在后台发生,否则用户将抱怨Open File对话框无效。在后台运行某些任务的明显方法是在不同的线程上运行它们。这就是我们所看到的。
你留下的线程怎么样?那么其中有些是留在那里的,用户将决定打开另一个文件:在这种情况下,它节省了大量的时间,流量和打字。上一次用于这一个特定过程的自定义认证? – 存储。那些讨厌的PDF的预览图标? – 还在那儿。目录中每部影片的长度和比特率? – 仍然可用,无需重新解析它们。
当然线程本身并不奇怪。查看有多少个DLL已经映射到进程中。看一些他们可以得到一个有趣的图片添加了什么功能。
查看它的另一个有趣的方法是在每个线程创建时转储调用堆栈。这显示了哪些DLL(有时是哪个对象)创建它们。 Here’s x64 Win7如何创建所有线程。可以找到Explorer框架的线程创建;一些OLE活动将用于实例化文件过滤器,其中一些可以生成预览图标,叠加和工具提示;属于搜索子系统的几个线程; shell的设备枚举器(所以如果用户插入新设备,它会自动出现在打开的对话框中);外壳网络监视器(同上)等。
好消息是它发生得很快,并且不会对你的进程造成太多的开销。大多数线程花费大部分时间等待一些很少的事件(如插入USB密钥),所以cpu不花费任何时间执行它们。每个线程在您的进程中消耗1MB的虚拟地址空间,但实际物理内存只有4KB页。大多数(如果不是全部)这些DLL没有使用任何磁盘带宽加载:它们已经在RAM中,所以它们几乎可以被映射到你的进程中。