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 

Фоновый подсчёт размера папки по пробелу

 
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы printer-friendly view
View previous topic :: View next topic  
Author Message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Thu Dec 11, 2008 15:24    Post subject: Фоновый подсчёт размера папки по пробелу Reply with quote

Можно ли сделать подсчет размера папки при нажатии на пробел фоновым процессом?

 !  Моторокер:
Второй вопрос удалён, заголовок поправлен.
Один вопрос – одна тема.
Back to top
View user's profile Send private message  
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Thu Dec 11, 2008 15:28    Post subject: Reply with quote

Да, да.
Вопроса "как это сделать" не было. Тем не менее: в первом случае - плагин DirSizeCalc, во втором - ответ настолько очевиден, что оягребу.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message  
ICQ Number
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Thu Dec 11, 2008 15:47    Post subject: Reply with quote

По второму, извеняюсь, наверно промахнулся мимо ОК, поэтому и решиль задать вопрос пока паника не охватилав.

Первый: dirsizecalc - знаю, но это не то, в вопросе написано при нажатии на пробел!
Back to top
View user's profile Send private message  
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Thu Dec 11, 2008 16:56    Post subject: Reply with quote

Действительно, посмотрел - DirSizeCalc последней версии всё считает в фоне. Тем не менее спецификация контентных плагинов позволяет делать именно то, что требуется, и был уверен, что DirSizeCalc это умеет.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message  
ICQ Number
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Thu Dec 11, 2008 17:51    Post subject: Reply with quote

Жаль что нет решения подсчету размера папки в фоне при нажатии на пробел. В иделе, лучше бы это было вшито в программу по умолчанию, а то если папка большая - все встает, и приходиться жать esc.

Еще вопрос, чтобы не создавать новую тему.
Ради интереса посмотрел UnrealCommander у него осуществляется навигация по папкам в строке пути. Как это сделать в TC, я нашел на форуме ответ, порпавил ini (не помую что), но эффекта не получил, при одинарном нажатии на строку пути, она выделяется.

 !  CaptainFlint:
Нарушение пп. 9, 12 правил.
Back to top
View user's profile Send private message  
Avada



Joined: 01 Aug 2008
Posts: 10417
Location: Россия, Саратов

Post (Separately) Posted: Thu Dec 11, 2008 19:46    Post subject: Reply with quote

_Johm
Нажимать с Shift или указать в wincmd.ru значение ключа InplaceRenamePath=2 (ручками). В TC 7.50 всё будет ещё интереснее.

_Johm wrote:
Еще вопрос, чтобы не создавать новую тему.

После таких слов обычно приходит модератор и следуют выводы. Правила надо соблюдать.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message  
CaptainFlint



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

Post (Separately) Posted: Fri Dec 12, 2008 01:54    Post subject: Reply with quote

D1P wrote:
Тем не менее спецификация контентных плагинов позволяет делать именно то, что требуется

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



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Fri Dec 12, 2008 08:30    Post subject: Reply with quote

CaptainFlint wrote:
D1P wrote:
Тем не менее спецификация контентных плагинов позволяет делать именно то, что требуется

Что-то я не помню такого в спецификации… Там, если не ошибаюсь, либо в фоне, либо по запросу, но не то и другое вместе.

В общем да, по пробелу и в фоне вот так сразу - нельзя.
Но можно сделать так: в ContentGetValue возвращать ft_ondemand, тут же фоновым потоком посчитать и запомнить размер каталога, а при нажатии пробела вернуть уже готовую цифру.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message  
ICQ Number
CaptainFlint



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

Post (Separately) Posted: Fri Dec 12, 2008 11:45    Post subject: Reply with quote

D1P wrote:
Но можно сделать так: в ContentGetValue возвращать ft_ondemand, тут же фоновым потоком посчитать и запомнить размер каталога, а при нажатии пробела вернуть уже готовую цифру.

Так автору темы, как я понимаю, требуется совсем другое: чтобы система не грузилась постоянными обновлениями/подсчётами, а только тогда, когда это действительно нужно (при нажатии пробела), и при этом чтобы сам Тотал не зависал. К сожалению, такое сделать вряд ли получится. Можно, конечно, по пробелу вернуть какой-нибудь 0 и начать подсчёт, но как Тоталу сообщить, что подсчёт закончен и можно обновлять значение? Разве что хаком — послать сообщение окну Тотала на перечитывание данных, чтобы он снова запросил плагин о значении, и тот ему уже вернул бы корректную величину. Но заморочек, ИМХО, неоправданно много.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message  
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Fri Dec 12, 2008 13:03    Post subject: Reply with quote

Quote:
К сожалению, такое сделать вряд ли получится

Гм, не вижу больших трудностей. Может мы друг друга недопоняли.
Код примерно такой, за неимением времени до компилируемого состояния не расписываю:
Code:

function ContentGetValue(FileName:pchar;FieldIndex,UnitIndex:integer;FieldValue:pbyte;maxlen,flags:integer):integer; stdcall;
Begin
if Flags=CONTENT_DELAYIFSLOW then
 begin
 GetDirSizeBackground (FileName,DirSize);
 Result:=ft_ondemand;
 end else
 begin
 if DirSizeCounted (FileName) then Move(DirSize, FieldValue^, sizeof(DirSize)) else {тут можно подождать, или посчитать, или ещё что-то}
 Result:=ft_numeric_32;
 end;
End;

DirSize - глобальная переменная, будем считать, что GetDirSizeBackground отрабатывает в фоне. Прекрасно знаю, что вызов должен быть совсем другой, и надо будет заботиться о куче вещей: успела ли отработать функция получения размера, не был ли подсчитан размер раньше, и т.д. Но это всё решаемо.

Другое дело, что для текущей задачи я бы заморачиваться не стал.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message  
ICQ Number
CaptainFlint



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

Post (Separately) Posted: Fri Dec 12, 2008 13:52    Post subject: Reply with quote

D1P wrote:
Может мы друг друга недопоняли.

Похоже. По твоему коду (и предыдущему описанию) получается вот что:
1. Открываю в Тотале каталог.
2. Включаю нужный набор колонок.
3. Тотал лезет в плагин запрашивать все поля.
4. Плагин возвращает ondemand, но сам в этот момент подло начинает сканить все папки на предмет вычисления их размеров.
5. Итог: имеем тормоза, от которых как раз и призван был спасать ondemand, который не выполняется, пока ты явно не нажмёшь пробел.

Иначе говоря, твой вариант ничем не отличается от стандартного фонового подсчёта размеров, реализованного в DirSizeCalc. Отличие лишь одно: размер будет показан не сразу, а лишь по нажатию пробела, что в такой реализации выглядит просто глупо: раз уж всё равно потратили время и ресурсы компа на вычисление, так что уж результаты-то теперь скрывать?
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message  
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Fri Dec 12, 2008 14:38    Post subject: Reply with quote

Quote:
Иначе говоря, твой вариант ничем не отличается от стандартного фонового подсчёта размеров, реализованного в DirSizeCalc. Отличие лишь одно: размер будет показан не сразу, а лишь по нажатию пробела, что в такой реализации выглядит просто глупо: раз уж всё равно потратили время и ресурсы компа на вычисление, так что уж результаты-то теперь скрывать?


Я вижу теоретические варианты, когда такой подход будет иметь плюсы. Например, поток скана можно запускать с приоритетом Idle, на современных машинах его работа будет совсем незаметна. А в случае, если пользователь ВНЕЗАПНО решит проверить размер каталога - ему подсунется готовое значение. Собранные значения можно кешировать.

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

Так что это всё из области измышлений "а что, если?".
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message  
ICQ Number
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Fri Dec 12, 2008 18:50    Post subject: Reply with quote

D1P wrote:
Например, поток скана можно запускать с приоритетом Idle, на современных машинах его работа будет совсем незаметна.

Операции с внешними носителями всё равно медленнее, чем со встроенными. Допустим, подсчёт значений по сети или на CD может затянуться. Кроме того, будет бессмысленно нагружать сеть или привод CD. К тому же, для CD придётся гонять компакт туда-сюда, если перемещаться по папкам диска. Тотал то содержимое текущей папки будет считать, то вложенных.


Зачем вообще может понадобиться фоновый подсчёт значений?

Например, чтобы подсчитать общий объём нескольких каталогов. Нажать пробел и стрелку вниз в таком случае быстрее, чем Alt+Enter или Ctrl+L.

Но ведь буфер клавиатуры кешируется. И даже если первая папка содержит много папок/файлов, нажатие стрелки вниз всё равно сработает, но позже.

Тогда какая практическая польза от фонового подсчёта? Красивый вид панелей без зависания?


Ещё вопрос: если Application.ProcessMessages периодически будет срабатывать во время подсчёта, проблема решится?
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message  
ICQ Number
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Fri Dec 12, 2008 20:02    Post subject: Reply with quote

Quote:
Тогда какая практическая польза от фонового подсчёта? Красивый вид панелей без зависания?

По тому теоретическому варианту, который я привёл, всё расписано выше.
Quote:
Ещё вопрос: если Application.ProcessMessages периодически будет срабатывать во время подсчёта, проблема решится?

Где? У dll нет Application.ProcessMessages. Если имеется в виду впихнуть это в TC - хз, как там устроено, подозреваю что всё равно нет.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message  
ICQ Number
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Mon Dec 15, 2008 16:11    Post subject: Reply with quote

2 Моторокер
Quote:
Тогда какая практическая польза от фонового подсчёта? Красивый вид панелей без зависания?


Во время этого зависания можно переключиться в другую панель и начать подготовку для копирования; к тому же для подсчета иногда тербуется несколько секунд, а если папок тоже несколько?
Back to top
View user's profile Send private message  
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Общие вопросы All times are GMT + 4 Hours
Page 1 of 1

 
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