FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by HaRT »

buniak_a_h wrote: Tue 27 Oct, 2020 04:00
SEt wrote: Tue 27 Oct, 2020 03:33 так как в API теперь нет быстрого способа узнать, файл или каталог
Такое не считается быстрым? Прошу прощения, если в синтаксисе напорол - на C с 94-го года прошлого тысячелетия не писал… Но идея понятна

Code: Select all

PanelControl(PANEL_ACTIVE, FCTL_GETPANELITEM, i, &pri);
if (pri->item.FileAttributes & FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY)
В Энциклопедии рекомендуется спрашивать необходимый размер памяти, затем её выделять, затем передавать её в PanelControl (а потом освобождать). Когда требуется получить атрибуты всех элементов панели, такой подход становится неоправданно ресурсоёмким.
Если никакие данные переменного размера (имя, описание и т.п.) не интересуют, допустимо ли установить FarGetPluginPanelItem::Size в sizeof(PluginPanelItem) и рассчитывать, что Фар вернёт корректно заполненные поля, не являющиеся указателями? (И пусть бы себе в этом случае все указатели возвращались нулевые.)
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by DrKnS »

HaRT wrote: Tue 27 Oct, 2020 14:01допустимо ли установить FarGetPluginPanelItem::Size в sizeof(PluginPanelItem) и рассчитывать, что Фар вернёт корректно заполненные поля, не являющиеся указателями?
В данный момент нет. Но, действительно, если передали хотя бы sizeof(PluginPanelItem) - можно бы и заполнить.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by buniak_a_h »

HaRT, я упрощённо описал. Естественно, надо получить размер.
FarEncyclopedia.ru\html\service_functions\panelcontrol.html wrote: Внимание! Tак делать нельзя:

PluginPanelItem PPI;
Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,J,&PPI);

Пример правильного использования:

Code: Select all

for(int J=0; J < PInfo.ItemsNumber; J++)
{
  size_t Size=Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,J,0);
  PluginPanelItem *PPI=(PluginPanelItem*)malloc(Size);
  if (PPI)
  {
    FarGetPluginPanelItem FGPPI={sizeof(FarGetPluginPanelItem),Size,PPI};
    Info.PanelControl(PANEL_ACTIVE,FCTL_GETPANELITEM,J,&FGPPI);
    lstrcpy(CurFile[J],PPI->FileName);
    free(PPI);
  }
}
Из всего этого самая медленная операция - выделение/освобождение памяти, насколько я понимаю. Соответственно, эффективнее было бы пробежаться по всем J, получить максимальный Size, выделить память и уже вторым проходом получить конкретные данные. Если я правильно понимаю логику программы… Но это всё равно не «небыстрый способ».
Last edited by buniak_a_h on Tue 27 Oct, 2020 16:26, edited 1 time in total.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by HaRT »

DrKnS wrote: Tue 27 Oct, 2020 15:37 действительно, если передали хотя бы sizeof(PluginPanelItem) - можно бы и заполнить
Если кто-то это реализует, я готов дополнить Энциклопедию.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by DrKnS »

HaRT wrote: Tue 27 Oct, 2020 20:38 Если кто-то это реализует, я готов дополнить Энциклопедию
Ловлю на слове.
5695: если размер меньше необходимого, то пишем столько, сколько получится.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by HaRT »

DrKnS wrote: Tue 27 Oct, 2020 21:57Ловлю на слове.
На этой неделе будет от меня pull request.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by buniak_a_h »

DrKnS wrote: Tue 27 Oct, 2020 21:57 если размер меньше необходимого, то пишем столько, сколько получится.
А если не помещается, то какое поле структуры PluginPanelItem будет обрезано? Или я не о том?
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by HaRT »

buniak_a_h wrote: Tue 27 Oct, 2020 22:59 если не помещается, то какое поле структуры PluginPanelItem будет обрезано?
Я смотрел реализацию — никакое не будет обрезано. Те, которые можно заполнить без потерь, заполняются «жадно» (в детерминированном порядке); те, которые не помещаются целиком, вообще не заполняются. Как только нашлось первое непомещающееся поле, заполнение последующих полей не происходит, возвращается полный необходимый размер.
Last edited by HaRT on Tue 27 Oct, 2020 23:15, edited 1 time in total.
Фар есть инструмент, а не нянька. © 2009 DrKnS
SEt
Posts: 526
Joined: Mon 21 Mar, 2005 10:22
Location: Питер
Been thanked: 46 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by SEt »

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

Возможно, лучше было бы сделать какую-то другую функцию, которая принимает маску, что мы хотим получить заполненное или просто отдаёт данные одного указанного типа (имена, времена, размеры,...) в новых структурах.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by HaRT »

SEt wrote: Tue 27 Oct, 2020 23:33 я предпочёл бы реализацию, которая просто заполняет поля фиксированного размера
Это частный случай текущей реализации, надо только при вызове…
HaRT wrote: Tue 27 Oct, 2020 14:01установить FarGetPluginPanelItem::Size в sizeof(PluginPanelItem)
Фар есть инструмент, а не нянька. © 2009 DrKnS
SEt
Posts: 526
Joined: Mon 21 Mar, 2005 10:22
Location: Питер
Been thanked: 46 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by SEt »

Это то очевидно, я про идею реализации.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by DrKnS »

Вообще, у меня складывается впечатление, что проблема "раньше было лучше" "вот раньше был быстрый способ, а теперь нет" несколько преувеличена. Оно точно тормозит? Кто-то измерял?
В т.н. "быстром" способе как бы ничего быстрого не было.
Снаружи да, оно выглядело как массив готовых данных на блюдечке с итерацией за O(1), но чудес же не бывает, просто всю грязную работу делал фар. Причем всю сразу, независимо от того, надо вам один файл или миллион.

Сейчас как бы можно в большинстве случаев память .

SEt wrote: Tue 27 Oct, 2020 23:33Текущая логика "заполняем сколько уместится" практически не требуется
Мотивация - оппортунизм: "хочу только имена, эмпирическим путем полагаю, что 1к мне на имя хватит, остальное пофиг".

Разумеется, всё это никак не препятствует добавлению новых FCTL и структур, если есть такая необходимость.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by HaRT »

HaRT wrote: Tue 27 Oct, 2020 22:26
DrKnS wrote: Tue 27 Oct, 2020 21:57Ловлю на слове.
На этой неделе будет от меня pull request.
Блин, проблемка. При вставке нового содержимого через веб-интерфейс ГитХаб безапелляционно заявляет: “We’ve detected the file encoding as ISO-8859-1. When you commit changes we will transcode it to UTF-8.” и показывает дифф на все кириллические фрагменты. А для обычного коммита со своего компа у меня условий нет, т.к. аутентификация для ГитХаба настроена на рабочую учётку. Прилагаю изменённые файлы тут.
Attachments
FCTL_GETPANELITEM_2020-11-02.7z
Обновлённые panelcontrol.html и fargetpluginpanelitem.html
(5.6 KiB) Downloaded 119 times
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by DrKnS »

HaRT, спасибо, добавил.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

FCTL_GETPANELITEM — как *быстро* определить, директория ли?

Post by HaRT »

DrKnS wrote: Mon 02 Nov, 2020 03:32 HaRT, спасибо, добавил.
Отчего же не взяли второй файл (про структуру)? Там тоже полезные правки.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Post Reply

Return to “Разработка плагинов”