windows – 为什么要打开一个产生大量线程的TOpenDialog?
我有一个非常简单的表单,一个TOpenDialog和一个按钮。当我按下按钮时,它会在对话框中调用执行。如果我在调试器中看到,打开对话框的行为会产生一些像14个线程的东西,当我关闭对话框时,它们也不会消失。
任何人都知道发生了什么事情?
想像你想向朋友展示太平洋西北地区有多美丽。您决定开车去拍摄
sunset over the Pacific的几张照片。您真正关心的是图像文件回到家,他们可以上传到Facebook。实际上,摄像机,镜头和三脚架需要在
Olympics和后面被拖运。您还需要带上将照相机放置并按下快门的摄影师(自己)。摄影师需要在相对舒适的地方移动到这里,所以你坐下来,摄影师在旅途中休息。这个座椅被封闭在一个闪亮的金属盒子里,其中一些其他的金属,玻璃和橡胶件,其中一些是转动和往复运动的。最后,大约两吨的东西(和一个活着的人)进行多小时的旅行,燃烧了加仑的碳氢化合物液体,目的是将一些信息从岸边移到互联网。
与您的应用程序完全相同的事情。当用户想要使用“打开文件”对话框打开文件时,用户希望能够: >导航到包含文件的目录(该目录可能在本地硬盘驱动器或CD / DVD / BR或网络驱动器或存档等)。媒体可能被加密或压缩,这需要不同的显示媒体可能不插入,用户可能需要提示它们。媒体可能需要用户的凭据,必须要求); 操作系统允许所有这些都通过基本上给您的进程大部分的Windows资源管理器功能发生。其中一些必须在后台发生,否则用户将抱怨Open File对话框无效。在后台运行某些任务的明显方法是在不同的线程上运行它们。这就是我们所看到的。 你留下的线程怎么样?那么其中有些是留在那里的,用户将决定打开另一个文件:在这种情况下,它节省了大量的时间,流量和打字。上一次用于这一个特定过程的自定义认证? – 存储。那些讨厌的PDF的预览图标? – 还在那儿。目录中每部影片的长度和比特率? – 仍然可用,无需重新解析它们。 当然线程本身并不奇怪。查看有多少个DLL已经映射到进程中。看一些他们可以得到一个有趣的图片添加了什么功能。 查看它的另一个有趣的方法是在每个线程创建时转储调用堆栈。这显示了哪些DLL(有时是哪个对象)创建它们。 Here’s x64 Win7如何创建所有线程。可以找到Explorer框架的线程创建;一些OLE活动将用于实例化文件过滤器,其中一些可以生成预览图标,叠加和工具提示;属于搜索子系统的几个线程; shell的设备枚举器(所以如果用户插入新设备,它会自动出现在打开的对话框中);外壳网络监视器(同上)等。 好消息是它发生得很快,并且不会对你的进程造成太多的开销。大多数线程花费大部分时间等待一些很少的事件(如插入USB密钥),所以CPU不花费任何时间执行它们。每个线程在您的进程中消耗1MB的虚拟地址空间,但实际物理内存只有4KB页。大多数(如果不是全部)这些DLL没有使用任何磁盘带宽加载:它们已经在RAM中,所以它们几乎可以被映射到你的进程中。 最后,用户在一个快速的UI中获得了很多有用的功能,而该过程不得不做很少的事情来实现所有这一切。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – 在Windows Azure上部署MPI应用程序
- 如何在Windows中使用python opencv2在图像上写文本
- 有关SetWindowsHookEx()和挂钩的问题
- windows – 更改背景图像时的动画(C#winrt)
- 如何使用Windows注册最近使用的列表来准备Windows 7?
- windows-server-2012-r2 – 用户文件夹被重命名为“我的文档
- 当我尝试在Windows / Cygwin上使用Ansible配置Vagrant VM时
- 从非交互式进程(Windows服务,计划任务等)在WinServer 2008中
- 带有双引号的字符串回显使用Windows批处理输出文件
- windows-server-2012 – SMB3多路径可以按策略加权吗?
- Windows服务 – 计划任务或Windows服务
- windows-8 – 无法在Windows 8中播放声音
- windows – 如何识别哪个bitlocker保护器处于活动
- Windows – 如何在Active Directory中启用密码质
- 使用Azure存储像用户图片这样的东西? Blob存储?
- windows-server-2003 – 最佳Raid 10条带大小的E
- Win2008 R2 WEB 服务器安全设置指南之修改3389端
- HoTMaiL或Windows Live ID是否支持OpenID认证?
- winapi – 使用Win32 API的Windows“真实”用户列
- 如何在Windows上的C中为double添加千位分隔符?