Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > 7z.dll+sevenzip.pas для Delphi |
Автор: CHERRY 30.10.2012, 20:52 | ||||
Доброго времени суток! Есть не решаемые проблемы с ProgressCallback. Распаковка архива работает без проблем:
С архивацией проблемы:
Если закомментировать SetProgressCallback(nil, ProgressCallback);, архивация проходит нормально. Иначе все виснет намертво. Это глюки продукта или непонимание процесса. Версия продукта: (* 7-ZIP DELPHI API *) (* Unit owner : Henri Gourvest <[email protected]> *) (* V1.2 *) Оригинал прилагается. (********************************************************************************) |
Автор: CHERRY 30.10.2012, 22:30 | ||
Выяснилось, что ProgressCallback при архивации срабатывает для одного файла. Вот рабочий пример:
Как то так. |
Автор: CHERRY 1.11.2012, 16:18 |
Все хорошо работает только для архивов 7z OutArchive := CreateOutArchive(CLSID_CFormatZip); Спасибо за внимание. Добавлено через 1 минуту и 34 секунды Ошибочка, вот так CreateOutArchive(CLSID_CFormat7z) |
Автор: barbee 6.6.2013, 22:22 | ||||
Времени прошло немало, но всё же вопрос висит без ответа, а топик в гугле находится первым по запросу "sevenzip.pas setprogresscallback". Так что напишу, как решить проблему, мало ли кто-то ещё столкнётся. Дело явно в кривой работе с потоками где-то на стыке VCL и 7z.dll. То ли распаковка там идёт не в том потоке, где нужно, то ли ещё что. В общем, расковыривать проблему до основания я не стал, благо решение быстро нашлось. Пример одного из вариантов решения приложен в комментариях прямо на https://code.google.com/p/d7zip/issues/detail?id=2#c1. Второй, на мой взгляд, несколько проще. Достаточно одного вызова, по документации устанавливающего количество рабочих потоков в 1.
И всё начинает работать как надо. Итого, код будет выглядеть так:
|