【问题标题】:How to drag & drop lots of files without taxing system resources?如何在不占用系统资源的情况下拖放大量文件?
【发布时间】:2023-03-31 12:14:01
【问题描述】:

我正在开发的程序的一个功能是能够从其主窗口拖动对象并将它们作为文件拖放到 Windows 资源管理器中。

为此,我们覆盖COleDataSource::OnRenderGlobalData(),并且当格式为CF_HDROP 时,我们将每个对象保存为一个文件。当对象数量很少时,这可以正常工作。

但是,由于我们现在正致力于支持企业级数量的对象,因此当用户尝试将大量对象从我们的应用程序拖到 Windows 资源管理器中时,我们会看到很大的延迟,有时会导致挂起或最终崩溃.

我猜这是因为OnRenderGlobalData() 被调用了很多次,当然,每次它都必须循环遍历被拖动的对象并将它们保存为文件。

我正在研究覆盖 OnRenderFileData() 的想法,但问题是它一次只处理一个文件。

当用户尝试将大量对象拖到 Windows 资源管理器上时,有什么方法可以加快我们的应用程序,最好是通过将保存循环移动到在实际放置时只能执行一次的地方?

【问题讨论】:

  • 源对象是什么?他们一开始有文件支持吗?与将同等数量的对象从 Outlook 文件夹拖动到桌面相比,拖放的性能如何?我有一些拖放代码可供参考,但想了解更多有关数据的信息。
  • @selbie:源对象是垂直市场应用程序中的项目,开始时没有文件备份。与从 Outlook 文件夹中拖动相同数量的对象相比,性能似乎明显更快。 (我测试了 60 封电子邮件和 60 个我们的对象。)当用户尝试拖动大量这些对象(数百个或更多,这在大型网站上很常见,例如大学校园、大型建筑物等)进入 Windows 资源管理器。

标签: c++ windows mfc drag-and-drop


【解决方案1】:

不要创建文件,而是拖动拖放时生成的虚拟数据。提供 CFSTR_FILEGROUPDESCRIPTOR 和 CFSTR_FILECONTENTS。 Here's an example.

【讨论】:

  • 请详细解释一下。如何将“虚拟数据”(无论是什么)拖放到 Windows 资源管理器中并创建一个以前没有由作为数据源的应用程序创建的文件?
  • 这项技术看起来确实很有趣。这是一篇非常面向 MFC 的 codeproject 文章,它解释了更多 codeproject.com/KB/tips/ExplorerDelayDrop.aspx
  • 好的,这是正确的答案。将“虚拟文件”拖放到目标文件夹时,会在拖放完成后从 Windows 资源管理器对源应用程序 OnRenderFileData() 方法进行远程过程调用。现在源应用程序可以根据需要,显示进度指示等来写入文件。拖动开始时没有创建临时文件。 codeproject 文章是开始的地方 - 那里提供的代码编译和运行干净。
  • 这听起来很有用。谢谢。
【解决方案2】:

我也有同样的问题。我的“解决方案”不是很聪明。我提供拖放功能是为了方便少量对象。如果用户选择的对象数量多于可以很好处理的对象数量,则禁用拖放操作,而用户必须从文件夹浏览器对话框中选择目的地。选择目标后,对象将作为文件写入那里,并带有进度指示器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多