как узнать прогресс при упаковке?
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2  Next  :| |:
Total Commander -> Написание плагинов для Total Commander

#1: как узнать прогресс при упаковке? Author: vx2 PostPosted: Tue Sep 21, 2010 12:43
    —
сразу оговорюсь, не пишу плагин, а использую его. в тотале плагин работает и прогресс при упаковке показывает нормально.

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

но в функции упаковки, хендла нет. подскажите плз, откуда его брать?

#2:  Author: Reflector PostPosted: Wed Sep 22, 2010 21:57
    —
Он создается и возвращается из OpenArchive, например, в виде указателя на какой-то класс который хранит информацию о конкретном архиве.

#3:  Author: vx2 PostPosted: Thu Sep 23, 2010 13:44
    —
эм... при при упаковке он не требует OpenArchive, да и файла архива-то нету. при упаковке просто использую
Code:
int __stdcall PackFiles (char *PackedFile, char *SubPath, char *SrcPath, char *AddList, int Flags);

и все. архив создается уже самим плагином, и пакуется нормально, но хендлов у меня нет, а без него прогресс так понимаю не получить.

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

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

#6:  Author: CaptainFlintLocation: Москва PostPosted: Fri Sep 24, 2010 14:10
    —
По-моему, тут небольшая путаница начинается насчёт того, кто какие функции вызывает.

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

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

#7:  Author: Reflector PostPosted: Fri Sep 24, 2010 18:00
    —
vx2 wrote:
бр. что-то я совсем запутался. т.е. во время упаковки, первый запрос SetProcessDataProc вернет мне хендл упаковываемого файла через hArcData? или при упаковке мне не получить ее прогресс вообще? откуда тогда его берет сам тотал?

SetProcessDataProc вызывается один раз, причем до PackFiles и в нем передается указатель на встроенную функцию тотала, через которую можно указать текущий прогресс, а не получить Smile При распаковке вызывается сначала OpenArchive, потом SetProcessDataProc, в который передается hArcData созданный в OpenArchive, затем в цикле ReadHeader + ProcessFile на каждый файл, т.е. у тотала есть вся информация по содержимому архива и текущему состоянию потому во время обработки очередного файла он сам может обновлять текущий прогресс. А вот если ты не хочешь чтобы тотал распаковывал по одному файлу, т.к. это может быть очень медленно, то приходится сначала получать список всех файлов, затем за раз передавать его архиватору и тогда уже нужно заботиться об обновлении прогресса самому, как и при упаковке.

#8:  Author: Reflector PostPosted: Fri Sep 24, 2010 18:09
    —
CaptainFlint wrote:

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

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

#9:  Author: Reflector PostPosted: Fri Sep 24, 2010 18:32
    —
CaptainFlint wrote:

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

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

#10:  Author: CaptainFlintLocation: Москва PostPosted: Fri Sep 24, 2010 18:51
    —
Reflector wrote:
Только что проверил, если паковать одновременно два файла, то pProcessDataProc одинаковый...

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

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

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

#11:  Author: Reflector PostPosted: Fri Sep 24, 2010 19:27
    —
CaptainFlint wrote:

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

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

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

#12:  Author: vx2 PostPosted: Mon Oct 04, 2010 14:42
    —
прошу прощение за "отсутствие"...
Reflector wrote:
...
По идее он должен имитировать вызов SetProcessDataProc и передать туда -1 и указатель на свою функцию которая будет получать прогресс обновляемый плагином, а потом уже вызывать PackFiles.

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

#13:  Author: CaptainFlintLocation: Москва PostPosted: Mon Oct 04, 2010 16:23
    —
vx2 wrote:
как прогресс в этом случае должен работать, если до полной упаковки (ну или ошибки), программа ни чего не может делать((

Именно поэтому функция и называется callback — функция обратного вызова. Стек вызовов при этом выглядит так:
myapp.exe::main() -> plugin.dll::PackFiles() -> myapp.exe::pProcessDataProc()
Т.е. управление временно возвращается в твою программу.

#14:  Author: Reflector PostPosted: Mon Oct 04, 2010 20:08
    —
vx2 wrote:

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

Объявляешь функцию с такой же сигнатурой как принимает SetProcessDataProc, затем вызываешь SetProcessDataProc и передаешь ей указатель на свою функцию. Плагин будет в процессе паковки периодически твою функцию вызывать и она должна должна отображать прогресс, я так понимаю суммируя размеры получаемых файлов и высчитывая процент от общего размера. Ты вообще с какими архивами работаешь? Может проще заюзать внешний архиватор...

#15:  Author: vx2 PostPosted: Tue Oct 05, 2010 10:54
    —
вроде просветление нашло х) плагин в функцию прогресса запрос делает, но архив получается пустым. вот лог:
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 и что-то еще в ней не понравилось (уже не помню что - давно было).



Total Commander -> Написание плагинов для Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2  Next  :| |:
Page 1 of 2

Powered by phpBB © 2001, 2005 phpBB Group