7

Я хотел бы иметьМожно ли использовать SHFileOperation в рабочем потоке?

  • один фоновый поток, который будет копировать файлы с помощью функции SHFileOperation, всегда только один SHFileOperation в то время (но я хочу, чтобы быть в теме)
  • Мне нужна выходной интерфейс, так что мне нужно использовать FOF_SIMPLEPROGRESS флаг и передать что-то к Wnd члену

у меня есть два вопроса

  1. безопасно ли вызывать SHFileOperation с флагом FOF_SIMPLEPROGRESS (для взаимодействия с пользователем) из потока, отличного от основного?
  2. если да, то какую ручку я должен пройти в член Wnd? Я пробовал дескриптор основной формы, но когда, например, диалоговое окно подтверждения перезаписи всплывает, и вы подтвердите это, основная форма отправляется на задний план, что на самом деле странно

Примечание: У меня есть очередь для этих операций, поэтому выполняется только один SHFileOperation в то время (после того, как он закончил, поток переходит к другому действию, что может быть следующей SHFileOperation)

Большое спасибо

ответ

6
  1. это совершенно безопасно вызывать SHFileOperation из потока, отличного от основного потока.
  2. Я бы передал 0 в качестве члена hwnd. Если вы передадите дескриптор главного окна, я ожидаю, что это окно будет отключено, потому что SHFileOperation - это модальное диалоговое окно. Поскольку диалоговые окна подтверждения файла и прогресса являются интерфейсом верхнего уровня для фонового потока, вы не хотите, чтобы окна были отключены, когда отображаются эти модальные диалоги.
+0

Приятно слышать это. 'Wnd' член установлен в 0 работает отлично. Большое спасибо! –

+0

Кроме того, в документации также упоминается, что использование относительных путей с помощью SHFILEOPSTRUCT не является потокобезопасным. Поэтому, если вы используете это в рабочем потоке, вы должны использовать абсолютные пути! – 8bitwide

+0

@ 8bitwide Использование относительных путей никогда не является потокобезопасным. Не для вызова API. Это потому, что есть один рабочий каталог для каждого процесса. –