Ненужная сортировка

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

Играюсь с панельным плагином (Polygon), заметил, что после нажатия в панели на элемент .. (переход в родительскую директорию) почему-то производится ещё раз (на прощание что ли) сортировка элементов в той директории, которую покидаем. Это видно по логу, т.к. плагин экспортирует функцию CompareW.
Поскольку сортировка медленная (Lua без FFI), то на больших "папках" задержка весьма чувствительна.
Нельзя ли это полечить?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Ненужная сортировка

Post by DrKnS »

У меня например не производится.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

Хорошо, может быть я ошибаюсь (не исключено).

Приложен тест-вариант плагина (требует только внешнюю sqlite3.dll). Нужно распаковать в %farhome%\plugins.
Для получения лога нужно:
1. Запустить DebugView
2. В активной панели Far выставить сортировку по расширению
3. Стать на файл test\testdb2.sqlite3
4. Вручную или макросом нажать: Enter End Enter Enter Home Enter

В логе видно, что уже после вызова export.SetDirectory("..") происходит сортировка элементов таблицы Apples, из которой выходим в родительскую папку.

Если есть желание исследовать - можно это сделать вместе, в форуме или вне его.
Attachments
polygon-sort.7z
(51.31 KiB) Downloaded 84 times
Last edited by Shmuel on Mon 04 Jun, 2018 01:10, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Ненужная сортировка

Post by zg »

Shmuel wrote: Mon 04 Jun, 2018 01:044. Вручную или макросом нажать: Enter End Enter Enter Home Enter
вот тут два выхода по «..».
Shmuel wrote: Mon 04 Jun, 2018 01:04В логе видно, что уже после вызова export.SetDirectory("..") происходит сортировка элементов таблицы Apples, из которой выходим в родительскую папку.
это вызвано panel.SetDirectoriesFirst(handle, nil, false) в mypanel:get_panel_list.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Ненужная сортировка

Post by DrKnS »

zg wrote: Mon 04 Jun, 2018 08:45это вызвано panel.SetDirectoriesFirst(handle, nil, false) в mypanel:get_panel_list.
Причем в данном конкретном случае плагин меняет false на false.
Теоретически это можно оптимизировать внутри Far и не сортировать/перерисовывать, если это бессмысленно.
С другой стороны, плагин может сам проверять PFLAGS_DIRECTORIESFIRST и не делать лишних вызовов.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

Так, картина прояснилась, большое спасибо обоим ответившим.
DrKnS wrote: Mon 04 Jun, 2018 09:00 Теоретически это можно оптимизировать внутри Far и не сортировать/перерисовывать, если это бессмысленно.
На мой взгляд - бессмысленно, ведь плагин уже ответил в SetDirectoryW, что успешно изменил директорию.
DrKnS wrote: Mon 04 Jun, 2018 09:00 С другой стороны, плагин может сам проверять PFLAGS_DIRECTORIESFIRST и не делать лишних вызовов.
А если (в другом сценарии) вызов окажется не лишним, то будет производиться ненужная сортировка.
Сделать в плагине эту сортировку "холостой" (и, следовательно, быстрой) не проблема, но если бы можно было не вызывать эту сортировку в Фаре, было бы лучше.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

Ещё вариант - расширить структуру OpenPanelInfo, добавив новый член StartSortFlags, где можно было бы задавать дополнительные параметры начальной сортировки. В этом случае вызов FCTL_SETDIRECTORIESFIRST не понадобился бы.

P.S. Или добавить новые флажки прямо в существующее поле Flags.
Last edited by Shmuel on Mon 04 Jun, 2018 10:39, edited 1 time in total.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

Поскольку идея доработки структуры OpenPanelInfo представляется мне правильной (хотелось бы услышать ещё мнения по этому вопросу), надо бы ещё это грамотно реализовать. В частности - такой вариант, как использование члена StartSortOrder в новом качестве - как набор флагов (надо будет его переименовать в StartSortFlags), а его младший бит для обратной совместимости использовать по прежнему назначению.

Жду откликов прежде чем ломать дрова.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Ненужная сортировка

Post by DrKnS »

Shmuel wrote: Tue 05 Jun, 2018 06:27использование члена StartSortOrder в новом качестве - как набор флагов (надо будет его переименовать в StartSortFlags), а его младший бит для обратной совместимости использовать по прежнему назначению
Это breaking change. Лучше просто StartSortFlags (и не забывать проверять StructSize прежде чем его читать/писать).
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

DrKnS wrote: Tue 05 Jun, 2018 09:57 Это breaking change
На уровне сорс-кода - да. На уровне уже скомпилированных старых бинарников, учитывая описание в Энциклопедии - нет.
Я в общем-то не настаиваю. Но эта структура и так имеет много членов, хотелось обойтись без добавления ещё одного. Может быть добавить новые флажки в Flags ?
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Ненужная сортировка

Post by zg »

может просто во время получения списка файлов запретить сортировку?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Ненужная сортировка

Post by DrKnS »

Shmuel wrote: Tue 05 Jun, 2018 10:10На уровне уже скомпилированных старых бинарников, учитывая описание в Энциклопедии - нет.
Это как?
Плагин читает из структуры intptr_t (8 байт) и трактует его как bool целиком, а не только младший бит.
Если туда добавить флажков, например 0x10|0x40|0x80, то получится 0xD0, что тоже true, несмотря на то, что в младшем бите 0.

А, её же по идее только плагин заполняет.
Если не учитывать случай "межплагинового взаимодействия" - должно работать, да.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

zg wrote: Tue 05 Jun, 2018 10:27 может просто во время получения списка файлов запретить сортировку?
Меня бы это устроило (по крайней мере, проблема, описанная в начальном посте темы, ушла бы).
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Ненужная сортировка

Post by zg »

5226.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Ненужная сортировка

Post by Shmuel »

zg wrote: Tue 05 Jun, 2018 10:485226
Спасибо, работает как надо.
Post Reply

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