Страница 1 из 2

как узнать прогресс при упаковке?

Добавлено: Вт сен 21, 2010 12:43
vx2
сразу оговорюсь, не пишу плагин, а использую его. в тотале плагин работает и прогресс при упаковке показывает нормально.

по документации, в запросе участвует хендл обрабатываемого файла

Код: Выделить всё

 void __stdcall SetProcessDataProc (HANDLE hArcData, tProcessDataProc pProcessDataProc);
но в функции упаковки, хендла нет. подскажите плз, откуда его брать?

Добавлено: Ср сен 22, 2010 21:57
Reflector
Он создается и возвращается из OpenArchive, например, в виде указателя на какой-то класс который хранит информацию о конкретном архиве.

Добавлено: Чт сен 23, 2010 13:44
vx2
эм... при при упаковке он не требует OpenArchive, да и файла архива-то нету. при упаковке просто использую

Код: Выделить всё

int __stdcall PackFiles (char *PackedFile, char *SubPath, char *SrcPath, char *AddList, int Flags);
и все. архив создается уже самим плагином, и пакуется нормально, но хендлов у меня нет, а без него прогресс так понимаю не получить.

Добавлено: Пт сен 24, 2010 13:23
Reflector
Ты в SetProcessDataProc получаешь указатель на функцию, который нужно где-то хранить, вот тебе и предлагают его хранить в hArcData, если он, конечно, валидный, но при паковке он равен -1 и просто не используется...

Добавлено: Пт сен 24, 2010 13:45
vx2
бр. что-то я совсем запутался. т.е. во время упаковки, первый запрос SetProcessDataProc вернет мне хендл упаковываемого файла через hArcData? или при упаковке мне не получить ее прогресс вообще? откуда тогда его берет сам тотал?

Добавлено: Пт сен 24, 2010 14:10
CaptainFlint
По-моему, тут небольшая путаница начинается насчёт того, кто какие функции вызывает.

2Reflector
vx2 пишет не плагин, а программу, которая сама работает с чужими плагинами. Т.е. он сам должен плагину послать вызов функции SetProcessDataProc, имитируя поведение Тотала. Вот он и интересуется, что ему посылать плагину в качестве hArcData, если архив ещё не был открыт.

2vx2
Reflector говорит, что когда Тотал вызывает "упаковочный" SetProcessDataProc, в качестве hArcData передаётся -1. Соответственно, ты в этом случае тоже можешь посылать -1, как Тотал. Правда, остаётся вопрос, как же тогда Тотал различает прогрессы при параллельной работе нескольких операций упаковки… Я сам пакер-плагинов пока не писал, могу лишь предположить, что в этом случае различие идёт по имени файла, передаваемого плагином в вызове tProcessDataProc через поле FileName.

Добавлено: Пт сен 24, 2010 18:00
Reflector
vx2 писал(а):бр. что-то я совсем запутался. т.е. во время упаковки, первый запрос SetProcessDataProc вернет мне хендл упаковываемого файла через hArcData? или при упаковке мне не получить ее прогресс вообще? откуда тогда его берет сам тотал?
SetProcessDataProc вызывается один раз, причем до PackFiles и в нем передается указатель на встроенную функцию тотала, через которую можно указать текущий прогресс, а не получить :) При распаковке вызывается сначала OpenArchive, потом SetProcessDataProc, в который передается hArcData созданный в OpenArchive, затем в цикле ReadHeader + ProcessFile на каждый файл, т.е. у тотала есть вся информация по содержимому архива и текущему состоянию потому во время обработки очередного файла он сам может обновлять текущий прогресс. А вот если ты не хочешь чтобы тотал распаковывал по одному файлу, т.к. это может быть очень медленно, то приходится сначала получать список всех файлов, затем за раз передавать его архиватору и тогда уже нужно заботиться об обновлении прогресса самому, как и при упаковке.

Добавлено: Пт сен 24, 2010 18:09
Reflector
CaptainFlint писал(а): Правда, остаётся вопрос, как же тогда Тотал различает прогрессы при параллельной работе нескольких операций упаковки… Я сам пакер-плагинов пока не писал, могу лишь предположить, что в этом случае различие идёт по имени файла, передаваемого плагином в вызове tProcessDataProc через поле FileName.
Только что проверил, если паковать одновременно два файла, то pProcessDataProc одинаковый... Значит пока видимо тотал прогрессы при паковке не различает, ведь возможность паковать в фоне появилась только в последней бетке sdk для плагинов и раньше нельзя было паковать параллельно. Надеюсь в финале починят :)

Добавлено: Пт сен 24, 2010 18:32
Reflector
CaptainFlint писал(а): vx2 пишет не плагин, а программу, которая сама работает с чужими плагинами. Т.е. он сам должен плагину послать вызов функции SetProcessDataProc, имитируя поведение Тотала. Вот он и интересуется, что ему посылать плагину в качестве hArcData, если архив ещё не был открыт.
По идее он должен имитировать вызов SetProcessDataProc и передать туда -1 и указатель на свою функцию которая будет получать прогресс обновляемый плагином, а потом уже вызывать PackFiles.

Добавлено: Пт сен 24, 2010 18:51
CaptainFlint
Reflector писал(а):Только что проверил, если паковать одновременно два файла, то pProcessDataProc одинаковый...
А прогресс-бары у этих фоновых упаковок бегут правильно? Не смешиваются?
Reflector писал(а):Значит пока видимо тотал прогрессы при паковке не различает, ведь возможность паковать в фоне появилась только в последней бетке sdk для плагинов и раньше нельзя было паковать параллельно. Надеюсь в финале починят
В финале чего? Реализация SDK же сидит внутри Тотала, обновить что-либо без обновления Тотала невозможно, а Тотал уже давным-давно зафинален. Да и сами SDK, если уж на то пошло, уже из бета-стадии вышли.

Добавлено: Пт сен 24, 2010 19:27
Reflector
CaptainFlint писал(а): А прогресс-бары у этих фоновых упаковок бегут правильно? Не смешиваются?

В финале чего? Реализация SDK же сидит внутри Тотала, обновить что-либо без обновления Тотала невозможно, а Тотал уже давным-давно зафинален. Да и сами SDK, если уж на то пошло, уже из бета-стадии вышли.
Точно, просто когда я с плагинами возился, то sdk еще бетка была, а потом обновил на финал и забыл :) И с прогрессом доразобрался, у меня вызывается гуишный архиватор которому передается полный список файлов, т.е. файлы еще пакуются, а PackFiles уже отработал, потому если в это время начать паковать что-то еще, то тотал выдает тот же pProcessDataProc...

Добавлено: Пн окт 04, 2010 14:42
vx2
прошу прощение за "отсутствие"...
Reflector писал(а):...
По идее он должен имитировать вызов SetProcessDataProc и передать туда -1 и указатель на свою функцию которая будет получать прогресс обновляемый плагином, а потом уже вызывать PackFiles.
не совсем понял (я можно сказать начинающий программер), как именно это делается?
+наткнулся на другую проблему - программа ждет возврата из PackFiles, т.е. с момента отправки запроса, до момента возврата из плагина, прога полностью останавливается. с другой стороны конечно так и должно быть, но тогда я вообще в тупике и не понимаю в принципе - как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать((

Добавлено: Пн окт 04, 2010 16:23
CaptainFlint
vx2 писал(а):как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать((
Именно поэтому функция и называется callback — функция обратного вызова. Стек вызовов при этом выглядит так:
myapp.exe::main() -> plugin.dll::PackFiles() -> myapp.exe::pProcessDataProc()
Т.е. управление временно возвращается в твою программу.

Добавлено: Пн окт 04, 2010 20:08
Reflector
vx2 писал(а): не совсем понял (я можно сказать начинающий программер), как именно это делается?
+наткнулся на другую проблему - программа ждет возврата из PackFiles, т.е. с момента отправки запроса, до момента возврата из плагина, прога полностью останавливается. с другой стороны конечно так и должно быть, но тогда я вообще в тупике и не понимаю в принципе - как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать((
Объявляешь функцию с такой же сигнатурой как принимает SetProcessDataProc, затем вызываешь SetProcessDataProc и передаешь ей указатель на свою функцию. Плагин будет в процессе паковки периодически твою функцию вызывать и она должна должна отображать прогресс, я так понимаю суммируя размеры получаемых файлов и высчитывая процент от общего размера. Ты вообще с какими архивами работаешь? Может проще заюзать внешний архиватор...

Добавлено: Вт окт 05, 2010 10:54
vx2
вроде просветление нашло х) плагин в функцию прогресса запрос делает, но архив получается пустым. вот лог:

Код: Выделить всё

10:42:24 pre hArchData:-1
10:42:24 SetProcessDataProc return:11209700
10:42:24 post hArchData:-1
10:42:25 FileName:??????? |  Size:14
10:42:25 finished.
т.е. перед паковкой, отсылаю в "SetProcessDataProc" ("-1", адрес ф-ии прогресса), при этом "SetProcessDataProc" возвращает мне "11209700" (куда это использовать не понял), при этом "hArchData" не меняется. после этого отправляю на упаковку. в прогресс из плагина приходит (один раз) "FileName" ="???????", "Size"=14. после чего "PackFiles" выходит без ошибок, но созданный файл получается пустым. но если "SetProcessDataProc" не вызывать вообще, то при тех-же условиях, файлы в архив пакуются нормально. что я не так опять сделал?((
Reflector писал(а):...Ты вообще с какими архивами работаешь? Может проще заюзать внешний архиватор...
mpq. консольных не видел, да и не красиво смотреться будет, а пишу "для общего пользования", сам я и просто тоталом справляюсь (через этот-же плагин). искал просто библиотеки - нашел парочку, но одна похоже сильно старая и не все архивы открывает, а вторая без API и что-то еще в ней не понравилось (уже не помню что - давно было).