Возможно асинхронное перетаскивание OLE? - PullRequest
0 голосов
/ 04 июня 2009

Интересно, кто-нибудь знает, есть ли способ запустить перетаскивание OLE-файла из приложения C32 Win32 без блокировки до завершения перетаскивания.

В настоящее время я использую DoDragDrop () , чтобы начать операцию перетаскивания, но эта функция не возвращается, пока операция перетаскивания не будет завершена. Проблема в том, что анимация в моей программе останавливается во время перетаскивания.

Я пытался запустить эту команду из нового потока, но это не сработало, даже если я вызвал OleInitialize () в этом потоке.

Единственное, что я обнаружил в связи с этим, - это асинхронное выполнение операции с данными (например, копирование / перемещение файла / данных). В моем приложении перетаскивание не используется для таких операций, поэтому это не проблема, и основной проблемой является блок во время перетаскивания пользователем. Изменить: Чтобы быть более ясным об этом: IAsyncOperation на DataObject не является решением этой проблемы, потому что это делает операцию, происходящую только после того, как данные были отброшены асинхронно. Проблема, с которой я столкнулся, - это поведение блокировки с момента, когда пользователь начинает перетаскивать, до момента, когда он отпустит кнопку мыши.

2 решения приходят на ум, но я надеюсь, что будет более легкий или лучший способ достичь этого.

  1. Реализация моего собственного (не оле) перетаскивания. Это было бы больше работы, и я на самом деле нашел отличную возможность перетаскивать файлы из моей программы в другие программы.

  2. Создайте / запустите новый процесс и начните операцию перетаскивания оттуда. Поскольку у меня нет проблем при перетаскивании файла из проводника Windows внутри моего приложения, я думаю, что это может сработать. Перетаскивание должно начаться немедленно, и я не знаю, занимает ли заметное время создание нового процесса.

Ответы [ 4 ]

2 голосов
/ 25 июня 2009

Запустите анимацию в отдельном потоке.

2 голосов
/ 04 июня 2009

Если ваш IDataObject поддерживает интерфейс IAsyncOperation, тогда IDropTarget будет иметь возможность быстро завершить IDropTarget :: Drop () и затем выполнить фактическую передачу асинхронно. Однако IDropTarget не требуется для поддержки IAsyncOperation.

Это поведение описано в документации MSDN . Кроме того, DoDragDrop () не будет закрываться, пока пользователь не отпустит мышь, чтобы в любом случае инициировать удаление, поэтому ваш поток, который вызывает DoDragDrop (), будет по-прежнему заблокирован, пока пользователь перетаскивает мышь.

1 голос
/ 04 июня 2009

Ответ Реми правильный. Существует также набор постов из The Old New Thing о реализации IDataObject . Это не входит в IAsyncOperation, но это начало.

0 голосов
/ 04 июня 2009

Я столкнулся с этим. Я бы раскрутил новую тему и сделал это. CreateProcess требует времени, но, вероятно, не так много. Вы всегда можете заранее создать поток или процесс и синхронизировать его, чтобы он блокировался непосредственно перед вызовом DoDragDrop (), а затем разблокировал его из основного приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...