Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

как узнать прогресс при упаковке?
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
vx2



Joined: 09 Jul 2010
Posts: 9

Post (Separately) Posted: Tue Sep 21, 2010 12:43    Post subject: как узнать прогресс при упаковке? Reply with quote

сразу оговорюсь, не пишу плагин, а использую его. в тотале плагин работает и прогресс при упаковке показывает нормально.

по документации, в запросе участвует хендл обрабатываемого файла
Code:
 void __stdcall SetProcessDataProc (HANDLE hArcData, tProcessDataProc pProcessDataProc);

но в функции упаковки, хендла нет. подскажите плз, откуда его брать?
Back to top
View user's profile Send private message
Reflector



Joined: 29 Nov 2009
Posts: 56

Post (Separately) Posted: Wed Sep 22, 2010 21:57    Post subject: Reply with quote

Он создается и возвращается из OpenArchive, например, в виде указателя на какой-то класс который хранит информацию о конкретном архиве.
Back to top
View user's profile Send private message
vx2



Joined: 09 Jul 2010
Posts: 9

Post (Separately) Posted: Thu Sep 23, 2010 13:44    Post subject: Reply with quote

эм... при при упаковке он не требует OpenArchive, да и файла архива-то нету. при упаковке просто использую
Code:
int __stdcall PackFiles (char *PackedFile, char *SubPath, char *SrcPath, char *AddList, int Flags);

и все. архив создается уже самим плагином, и пакуется нормально, но хендлов у меня нет, а без него прогресс так понимаю не получить.
Back to top
View user's profile Send private message
Reflector



Joined: 29 Nov 2009
Posts: 56

Post (Separately) Posted: Fri Sep 24, 2010 13:23    Post subject: Reply with quote

Ты в SetProcessDataProc получаешь указатель на функцию, который нужно где-то хранить, вот тебе и предлагают его хранить в hArcData, если он, конечно, валидный, но при паковке он равен -1 и просто не используется...
Back to top
View user's profile Send private message
vx2



Joined: 09 Jul 2010
Posts: 9

Post (Separately) Posted: Fri Sep 24, 2010 13:45    Post subject: Reply with quote

бр. что-то я совсем запутался. т.е. во время упаковки, первый запрос SetProcessDataProc вернет мне хендл упаковываемого файла через hArcData? или при упаковке мне не получить ее прогресс вообще? откуда тогда его берет сам тотал?
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Fri Sep 24, 2010 14:10    Post subject: Reply with quote

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

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

2vx2
Reflector говорит, что когда Тотал вызывает "упаковочный" SetProcessDataProc, в качестве hArcData передаётся -1. Соответственно, ты в этом случае тоже можешь посылать -1, как Тотал. Правда, остаётся вопрос, как же тогда Тотал различает прогрессы при параллельной работе нескольких операций упаковки… Я сам пакер-плагинов пока не писал, могу лишь предположить, что в этом случае различие идёт по имени файла, передаваемого плагином в вызове tProcessDataProc через поле FileName.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Reflector



Joined: 29 Nov 2009
Posts: 56

Post (Separately) Posted: Fri Sep 24, 2010 18:00    Post subject: Reply with quote

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

SetProcessDataProc вызывается один раз, причем до PackFiles и в нем передается указатель на встроенную функцию тотала, через которую можно указать текущий прогресс, а не получить Smile При распаковке вызывается сначала OpenArchive, потом SetProcessDataProc, в который передается hArcData созданный в OpenArchive, затем в цикле ReadHeader + ProcessFile на каждый файл, т.е. у тотала есть вся информация по содержимому архива и текущему состоянию потому во время обработки очередного файла он сам может обновлять текущий прогресс. А вот если ты не хочешь чтобы тотал распаковывал по одному файлу, т.к. это может быть очень медленно, то приходится сначала получать список всех файлов, затем за раз передавать его архиватору и тогда уже нужно заботиться об обновлении прогресса самому, как и при упаковке.
Back to top
View user's profile Send private message
Reflector



Joined: 29 Nov 2009
Posts: 56

Post (Separately) Posted: Fri Sep 24, 2010 18:09    Post subject: Reply with quote

CaptainFlint wrote:

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

Только что проверил, если паковать одновременно два файла, то pProcessDataProc одинаковый... Значит пока видимо тотал прогрессы при паковке не различает, ведь возможность паковать в фоне появилась только в последней бетке sdk для плагинов и раньше нельзя было паковать параллельно. Надеюсь в финале починят Smile
Back to top
View user's profile Send private message
Reflector



Joined: 29 Nov 2009
Posts: 56

Post (Separately) Posted: Fri Sep 24, 2010 18:32    Post subject: Reply with quote

CaptainFlint wrote:

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

По идее он должен имитировать вызов SetProcessDataProc и передать туда -1 и указатель на свою функцию которая будет получать прогресс обновляемый плагином, а потом уже вызывать PackFiles.
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Fri Sep 24, 2010 18:51    Post subject: Reply with quote

Reflector wrote:
Только что проверил, если паковать одновременно два файла, то pProcessDataProc одинаковый...

А прогресс-бары у этих фоновых упаковок бегут правильно? Не смешиваются?

Reflector wrote:
Значит пока видимо тотал прогрессы при паковке не различает, ведь возможность паковать в фоне появилась только в последней бетке sdk для плагинов и раньше нельзя было паковать параллельно. Надеюсь в финале починят

В финале чего? Реализация SDK же сидит внутри Тотала, обновить что-либо без обновления Тотала невозможно, а Тотал уже давным-давно зафинален. Да и сами SDK, если уж на то пошло, уже из бета-стадии вышли.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Reflector



Joined: 29 Nov 2009
Posts: 56

Post (Separately) Posted: Fri Sep 24, 2010 19:27    Post subject: Reply with quote

CaptainFlint wrote:

А прогресс-бары у этих фоновых упаковок бегут правильно? Не смешиваются?

В финале чего? Реализация SDK же сидит внутри Тотала, обновить что-либо без обновления Тотала невозможно, а Тотал уже давным-давно зафинален. Да и сами SDK, если уж на то пошло, уже из бета-стадии вышли.

Точно, просто когда я с плагинами возился, то sdk еще бетка была, а потом обновил на финал и забыл Smile И с прогрессом доразобрался, у меня вызывается гуишный архиватор которому передается полный список файлов, т.е. файлы еще пакуются, а PackFiles уже отработал, потому если в это время начать паковать что-то еще, то тотал выдает тот же pProcessDataProc...
Back to top
View user's profile Send private message
vx2



Joined: 09 Jul 2010
Posts: 9

Post (Separately) Posted: Mon Oct 04, 2010 14:42    Post subject: Reply with quote

прошу прощение за "отсутствие"...
Reflector wrote:
...
По идее он должен имитировать вызов SetProcessDataProc и передать туда -1 и указатель на свою функцию которая будет получать прогресс обновляемый плагином, а потом уже вызывать PackFiles.

не совсем понял (я можно сказать начинающий программер), как именно это делается?
+наткнулся на другую проблему - программа ждет возврата из PackFiles, т.е. с момента отправки запроса, до момента возврата из плагина, прога полностью останавливается. с другой стороны конечно так и должно быть, но тогда я вообще в тупике и не понимаю в принципе - как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать((
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Mon Oct 04, 2010 16:23    Post subject: Reply with quote

vx2 wrote:
как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать((

Именно поэтому функция и называется callback — функция обратного вызова. Стек вызовов при этом выглядит так:
myapp.exe::main() -> plugin.dll::PackFiles() -> myapp.exe::pProcessDataProc()
Т.е. управление временно возвращается в твою программу.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Reflector



Joined: 29 Nov 2009
Posts: 56

Post (Separately) Posted: Mon Oct 04, 2010 20:08    Post subject: Reply with quote

vx2 wrote:

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

Объявляешь функцию с такой же сигнатурой как принимает SetProcessDataProc, затем вызываешь SetProcessDataProc и передаешь ей указатель на свою функцию. Плагин будет в процессе паковки периодически твою функцию вызывать и она должна должна отображать прогресс, я так понимаю суммируя размеры получаемых файлов и высчитывая процент от общего размера. Ты вообще с какими архивами работаешь? Может проще заюзать внешний архиватор...
Back to top
View user's profile Send private message
vx2



Joined: 09 Jul 2010
Posts: 9

Post (Separately) Posted: Tue Oct 05, 2010 10:54    Post subject: Reply with quote

вроде просветление нашло х) плагин в функцию прогресса запрос делает, но архив получается пустым. вот лог:
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
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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