Mas*_*ler 16 windows delphi multithreading topendialog
我有一个非常简单的表格,上面有一个TOpenDialog和一个按钮.当我按下按钮时,它会在对话框上调用Execute.如果我在调试器中观察,打开对话框的行为会产生类似于14个线程的行为,当我关闭对话框时它们也不会消失.
任何人都知道这是怎么回事?
想象一下,你想向你的朋友展示太平洋西北地区的美丽.你决定出发去拍几张太平洋上的日落照片.你真正关心的是图像文件回家的路上,它们可以上传到Facebook.实际上,相机,镜头和三脚架需要在奥运会上进行牵引然后回来.您还需要带摄影师(您自己),他将设置相机并按下快门.摄影师需要相对舒适地移动到那里并回来,所以你可以坐在摄影师休息的地方.这个座椅被封装在一个闪亮的金属盒子里,里面还有一堆其他金属,玻璃和橡胶部件,其中一些是转动和往复运动.最后,大约两吨东西(和一个活着的人)进行了数小时的旅行,燃烧加仑的碳氢化合物液体 - 目的是将一些信息从岸上移到互联网上.
您的应用程序完全相同. 当用户想要使用"打开文件"对话框打开文件时,用户希望能够:
操作系统可以通过为您的进程提供大部分Windows资源管理器功能来实现所有这些功能.其中一些必须在后台发生,否则用户会抱怨Open File对话框没有响应.在后台运行某些任务的显而易见的方法是在不同的线程上运行它们.这就是我们所看到的.
你问,留下的线程怎么样?好吧,其中一些留在那里,用户将决定打开另一个文件:在这种情况下,它节省了大量的时间,流量和打字.上次用于此特定进程的自定义身份验证? - 存储.那些讨厌的PDF的预览图标? - 还在那儿.目录中每部电影的长度和比特率? - 仍然可用,无需重新解析它们.
当然,线程并不仅仅是神奇地出现.查看已将多少DLL映射到进程中.看一下其中一些可以得到一个非常有趣的图片,说明添加了哪些功能.
查看它的另一个有趣的方法是在创建每个线程时转储callstack.这显示了哪个DLL(有时是哪个对象)创建了它们. 以下是x64 Win7创建所有线程的方式.可以找到Explorer框架的线程被创建; 一些OLE活动,用于实例化文件过滤器,其中一些可以生成预览图标,叠加和工具提示; 少数属于搜索子系统的线程; shell的设备枚举器(因此,如果用户插入新设备,它将自动出现在打开的对话框中); shell网络监视器(同上)和其他东西.
好消息是它快速发生并且不会给您的流程增加太多开销.大多数线程大部分时间都在等待一些很少的事件(比如插入USB密钥),因此CPU不会花任何时间执行它们.每个线程在您的进程中消耗1MB的虚拟地址空间,但只有少量4Kb页面的实际物理内存.大多数情况下,如果不是所有的DLL都没有使用任何磁盘带宽:它们已经在RAM中,所以它们几乎是免费映射到你的进程中的.
最后,用户在一个快速的UI中获得了许多有用的功能,而这个过程必须做很少的事情来实现所有这些.