Как перетаскивать много файлов без нагрузки на системные ресурсы? - PullRequest
6 голосов
/ 29 июля 2011

Одной из функций, над которыми я работаю, является возможность перетаскивать объекты из главного окна и помещать их в проводник Windows в виде файлов.

Для этого мы переопределяем COleDataSource::OnRenderGlobalData() и, когда формат CF_HDROP, мы сохраняем каждый объект в виде файла.Это прекрасно работает, когда количество объектов мало.

Однако, поскольку мы сейчас работаем над поддержкой количества объектов уровня предприятия, мы наблюдаем большие задержки, иногда приводящие к зависаниям или возможным сбоям, когда пользователь пытается перетащить множество объектов из нашего приложения.в проводнике Windows.

Я предполагаю, что это происходит потому, что OnRenderGlobalData() вызывается довольно много раз, и, конечно, каждый раз, когда ему приходится проходить по перетаскиваемым объектам и сохранять их как файлы.1010 *

Я искал идею переопределения OnRenderFileData(), но проблема в том, что он имеет дело только с одним файлом за раз.

Есть ли способ, которым я могу ускорить нашприложение, когда пользователь пытается перетащить множество объектов в проводник Windows, предпочтительно, перемещая цикл сохранения в место, где его можно выполнить только один раз, когда происходит фактическое удаление?

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

Вместо создания файлов перетащите виртуальные данные, которые генерируются во время отбрасывания.Предложить CFSTR_FILEGROUPDESCRIPTOR и CFSTR_FILECONTENTS. Вот пример .

0 голосов
/ 29 июля 2011

У меня такая же проблема. Мое «решение» не очень умное. Я предлагаю drag'n'drop для удобства небольшого количества объектов. Если при использовании было выбрано больше, чем количество объектов, которые можно хорошо обработать, drag'n'drop отключен, и вместо этого пользователь должен выбрать пункт назначения в диалоговом окне браузера папок. Когда место назначения выбрано, объекты записываются туда как файлы с индикатором выполнения.

...