我正在考虑编写一个Win32 Shell扩展,将一个页面添加到驱动器和文件夹的“属性”对话框中。此页面将显示可能获取成本高昂的信息。因此,我希望将数据采集逻辑放入工作线程中,以免破坏UI,并在相关页面上显示用户的反馈。当用户在“属性”对话框中选择页面(选项卡)时,页面将被初始化,从而触发数据采集过程。在阅读相关的MSDN文档之后,我不清楚如何将工作线程集成到Shell创建的属性对话框的属性表页面中。
通常,我会使用PostThreadMessage
将私有消息发布到工作线程的UI线程中的消息循环或UI线程中的MsgWaitForMultipleObjects
,并发出来自工作者的同步事件线程表示已完成工作单元,并且应更新UI反馈机制(例如,进度表)。但是,它们都需要集成到消息循环中,在Shell的“属性”对话框中,它是预定义的。
我注意到当我从Windows资源管理器中打开标准属性对话框并显示所选文件夹中的子文件夹和文件的计数时,文件夹/文件计数似乎正在发生在后台,因为对话框仍然有响应,所以我假设我想要做的事情一定是可能的吗?
答案 0 :(得分:1)
我做了同样的事情。使用SHCreateThread创建工作线程。在UI线程中我创建计时器。在OnTimer处理程序中,我查询工作线程有关进度状态的信息,依此类推。根据答案我更新我的工作表的UI。如果在工作线程完成计算之前用户关闭属性对话框,我只要求工作线程停止。当工作线程的循环完成时,shell32.dll会自动关闭线程,所以我不需要等待。