View previous topic :: View next topic |
Author |
Message |
vx2
Joined: 09 Jul 2010 Posts: 9
|
(Separately) Posted: Tue Sep 21, 2010 12:43 Post subject: как узнать прогресс при упаковке? |
|
|
сразу оговорюсь, не пишу плагин, а использую его. в тотале плагин работает и прогресс при упаковке показывает нормально.
по документации, в запросе участвует хендл обрабатываемого файла
Code: | void __stdcall SetProcessDataProc (HANDLE hArcData, tProcessDataProc pProcessDataProc); |
но в функции упаковки, хендла нет. подскажите плз, откуда его брать? |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Wed Sep 22, 2010 21:57 Post subject: |
|
|
Он создается и возвращается из OpenArchive, например, в виде указателя на какой-то класс который хранит информацию о конкретном архиве. |
|
Back to top |
|
|
vx2
Joined: 09 Jul 2010 Posts: 9
|
(Separately) Posted: Thu Sep 23, 2010 13:44 Post subject: |
|
|
эм... при при упаковке он не требует OpenArchive, да и файла архива-то нету. при упаковке просто использую
Code: | int __stdcall PackFiles (char *PackedFile, char *SubPath, char *SrcPath, char *AddList, int Flags); |
и все. архив создается уже самим плагином, и пакуется нормально, но хендлов у меня нет, а без него прогресс так понимаю не получить. |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Sep 24, 2010 13:23 Post subject: |
|
|
Ты в SetProcessDataProc получаешь указатель на функцию, который нужно где-то хранить, вот тебе и предлагают его хранить в hArcData, если он, конечно, валидный, но при паковке он равен -1 и просто не используется... |
|
Back to top |
|
|
vx2
Joined: 09 Jul 2010 Posts: 9
|
(Separately) Posted: Fri Sep 24, 2010 13:45 Post subject: |
|
|
бр. что-то я совсем запутался. т.е. во время упаковки, первый запрос SetProcessDataProc вернет мне хендл упаковываемого файла через hArcData? или при упаковке мне не получить ее прогресс вообще? откуда тогда его берет сам тотал? |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Fri Sep 24, 2010 14:10 Post subject: |
|
|
По-моему, тут небольшая путаница начинается насчёт того, кто какие функции вызывает.
2Reflector
vx2 пишет не плагин, а программу, которая сама работает с чужими плагинами. Т.е. он сам должен плагину послать вызов функции SetProcessDataProc, имитируя поведение Тотала. Вот он и интересуется, что ему посылать плагину в качестве hArcData, если архив ещё не был открыт.
2vx2
Reflector говорит, что когда Тотал вызывает "упаковочный" SetProcessDataProc, в качестве hArcData передаётся -1. Соответственно, ты в этом случае тоже можешь посылать -1, как Тотал. Правда, остаётся вопрос, как же тогда Тотал различает прогрессы при параллельной работе нескольких операций упаковки… Я сам пакер-плагинов пока не писал, могу лишь предположить, что в этом случае различие идёт по имени файла, передаваемого плагином в вызове tProcessDataProc через поле FileName. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Sep 24, 2010 18:00 Post subject: |
|
|
vx2 wrote: | бр. что-то я совсем запутался. т.е. во время упаковки, первый запрос SetProcessDataProc вернет мне хендл упаковываемого файла через hArcData? или при упаковке мне не получить ее прогресс вообще? откуда тогда его берет сам тотал?
|
SetProcessDataProc вызывается один раз, причем до PackFiles и в нем передается указатель на встроенную функцию тотала, через которую можно указать текущий прогресс, а не получить При распаковке вызывается сначала OpenArchive, потом SetProcessDataProc, в который передается hArcData созданный в OpenArchive, затем в цикле ReadHeader + ProcessFile на каждый файл, т.е. у тотала есть вся информация по содержимому архива и текущему состоянию потому во время обработки очередного файла он сам может обновлять текущий прогресс. А вот если ты не хочешь чтобы тотал распаковывал по одному файлу, т.к. это может быть очень медленно, то приходится сначала получать список всех файлов, затем за раз передавать его архиватору и тогда уже нужно заботиться об обновлении прогресса самому, как и при упаковке. |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Sep 24, 2010 18:09 Post subject: |
|
|
CaptainFlint wrote: |
Правда, остаётся вопрос, как же тогда Тотал различает прогрессы при параллельной работе нескольких операций упаковки… Я сам пакер-плагинов пока не писал, могу лишь предположить, что в этом случае различие идёт по имени файла, передаваемого плагином в вызове tProcessDataProc через поле FileName.
|
Только что проверил, если паковать одновременно два файла, то pProcessDataProc одинаковый... Значит пока видимо тотал прогрессы при паковке не различает, ведь возможность паковать в фоне появилась только в последней бетке sdk для плагинов и раньше нельзя было паковать параллельно. Надеюсь в финале починят |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Sep 24, 2010 18:32 Post subject: |
|
|
CaptainFlint wrote: |
vx2 пишет не плагин, а программу, которая сама работает с чужими плагинами. Т.е. он сам должен плагину послать вызов функции SetProcessDataProc, имитируя поведение Тотала. Вот он и интересуется, что ему посылать плагину в качестве hArcData, если архив ещё не был открыт.
|
По идее он должен имитировать вызов SetProcessDataProc и передать туда -1 и указатель на свою функцию которая будет получать прогресс обновляемый плагином, а потом уже вызывать PackFiles. |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Fri Sep 24, 2010 18:51 Post subject: |
|
|
Reflector wrote: | Только что проверил, если паковать одновременно два файла, то pProcessDataProc одинаковый... |
А прогресс-бары у этих фоновых упаковок бегут правильно? Не смешиваются?
Reflector wrote: | Значит пока видимо тотал прогрессы при паковке не различает, ведь возможность паковать в фоне появилась только в последней бетке sdk для плагинов и раньше нельзя было паковать параллельно. Надеюсь в финале починят |
В финале чего? Реализация SDK же сидит внутри Тотала, обновить что-либо без обновления Тотала невозможно, а Тотал уже давным-давно зафинален. Да и сами SDK, если уж на то пошло, уже из бета-стадии вышли. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Fri Sep 24, 2010 19:27 Post subject: |
|
|
CaptainFlint wrote: |
А прогресс-бары у этих фоновых упаковок бегут правильно? Не смешиваются?
В финале чего? Реализация SDK же сидит внутри Тотала, обновить что-либо без обновления Тотала невозможно, а Тотал уже давным-давно зафинален. Да и сами SDK, если уж на то пошло, уже из бета-стадии вышли.
|
Точно, просто когда я с плагинами возился, то sdk еще бетка была, а потом обновил на финал и забыл И с прогрессом доразобрался, у меня вызывается гуишный архиватор которому передается полный список файлов, т.е. файлы еще пакуются, а PackFiles уже отработал, потому если в это время начать паковать что-то еще, то тотал выдает тот же pProcessDataProc... |
|
Back to top |
|
|
vx2
Joined: 09 Jul 2010 Posts: 9
|
(Separately) Posted: Mon Oct 04, 2010 14:42 Post subject: |
|
|
прошу прощение за "отсутствие"...
Reflector wrote: | ...
По идее он должен имитировать вызов SetProcessDataProc и передать туда -1 и указатель на свою функцию которая будет получать прогресс обновляемый плагином, а потом уже вызывать PackFiles. |
не совсем понял (я можно сказать начинающий программер), как именно это делается?
+наткнулся на другую проблему - программа ждет возврата из PackFiles, т.е. с момента отправки запроса, до момента возврата из плагина, прога полностью останавливается. с другой стороны конечно так и должно быть, но тогда я вообще в тупике и не понимаю в принципе - как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать(( |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Mon Oct 04, 2010 16:23 Post subject: |
|
|
vx2 wrote: | как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать(( |
Именно поэтому функция и называется callback — функция обратного вызова. Стек вызовов при этом выглядит так:
myapp.exe::main() -> plugin.dll::PackFiles() -> myapp.exe::pProcessDataProc()
Т.е. управление временно возвращается в твою программу. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
Reflector
Joined: 29 Nov 2009 Posts: 56
|
(Separately) Posted: Mon Oct 04, 2010 20:08 Post subject: |
|
|
vx2 wrote: |
не совсем понял (я можно сказать начинающий программер), как именно это делается?
+наткнулся на другую проблему - программа ждет возврата из PackFiles, т.е. с момента отправки запроса, до момента возврата из плагина, прога полностью останавливается. с другой стороны конечно так и должно быть, но тогда я вообще в тупике и не понимаю в принципе - как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать((
|
Объявляешь функцию с такой же сигнатурой как принимает SetProcessDataProc, затем вызываешь SetProcessDataProc и передаешь ей указатель на свою функцию. Плагин будет в процессе паковки периодически твою функцию вызывать и она должна должна отображать прогресс, я так понимаю суммируя размеры получаемых файлов и высчитывая процент от общего размера. Ты вообще с какими архивами работаешь? Может проще заюзать внешний архиватор... |
|
Back to top |
|
|
vx2
Joined: 09 Jul 2010 Posts: 9
|
(Separately) Posted: Tue Oct 05, 2010 10:54 Post subject: |
|
|
вроде просветление нашло х) плагин в функцию прогресса запрос делает, но архив получается пустым. вот лог:
Code: | 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 wrote: | ...Ты вообще с какими архивами работаешь? Может проще заюзать внешний архиватор... |
mpq. консольных не видел, да и не красиво смотреться будет, а пишу "для общего пользования", сам я и просто тоталом справляюсь (через этот-же плагин). искал просто библиотеки - нашел парочку, но одна похоже сильно старая и не все архивы открывает, а вторая без API и что-то еще в ней не понравилось (уже не помню что - давно было). |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|