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

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

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

Post by Shmuel » Sun 03 Jun, 2018 18:47

Играюсь с панельным плагином (Polygon), заметил, что после нажатия в панели на элемент .. (переход в родительскую директорию) почему-то производится ещё раз (на прощание что ли) сортировка элементов в той директории, которую покидаем. Это видно по логу, т.к. плагин экспортирует функцию CompareW.
Поскольку сортировка медленная (Lua без FFI), то на больших "папках" задержка весьма чувствительна.
Нельзя ли это полечить?

User avatar
DrKnS
Posts: 4940
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 164 times

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

Post by DrKnS » Sun 03 Jun, 2018 22:15

У меня например не производится.

Shmuel
Posts: 5541
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 183 times

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

Post by Shmuel » Mon 04 Jun, 2018 01:04

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

Приложен тест-вариант плагина (требует только внешнюю 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 18 times
Last edited by Shmuel on Mon 04 Jun, 2018 01:10, edited 1 time in total.

User avatar
zg
zero-gravity
Posts: 5497
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 73 times
Contact:

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

Post by zg » Mon 04 Jun, 2018 08:45

Shmuel wrote:
Mon 04 Jun, 2018 01:04
4. Вручную или макросом нажать: 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: 4940
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 164 times

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

Post by DrKnS » Mon 04 Jun, 2018 09:00

zg wrote:
Mon 04 Jun, 2018 08:45
это вызвано panel.SetDirectoriesFirst(handle, nil, false) в mypanel:get_panel_list.
Причем в данном конкретном случае плагин меняет false на false.
Теоретически это можно оптимизировать внутри Far и не сортировать/перерисовывать, если это бессмысленно.
С другой стороны, плагин может сам проверять PFLAGS_DIRECTORIESFIRST и не делать лишних вызовов.

Shmuel
Posts: 5541
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 183 times

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

Post by Shmuel » Mon 04 Jun, 2018 09:36

Так, картина прояснилась, большое спасибо обоим ответившим.
DrKnS wrote:
Mon 04 Jun, 2018 09:00
Теоретически это можно оптимизировать внутри Far и не сортировать/перерисовывать, если это бессмысленно.
На мой взгляд - бессмысленно, ведь плагин уже ответил в SetDirectoryW, что успешно изменил директорию.
DrKnS wrote:
Mon 04 Jun, 2018 09:00
С другой стороны, плагин может сам проверять PFLAGS_DIRECTORIESFIRST и не делать лишних вызовов.
А если (в другом сценарии) вызов окажется не лишним, то будет производиться ненужная сортировка.
Сделать в плагине эту сортировку "холостой" (и, следовательно, быстрой) не проблема, но если бы можно было не вызывать эту сортировку в Фаре, было бы лучше.

Shmuel
Posts: 5541
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 183 times

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

Post by Shmuel » Mon 04 Jun, 2018 10:33

Ещё вариант - расширить структуру 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: 5541
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 183 times

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

Post by Shmuel » Tue 05 Jun, 2018 06:27

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

Жду откликов прежде чем ломать дрова.

User avatar
DrKnS
Posts: 4940
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 164 times

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

Post by DrKnS » Tue 05 Jun, 2018 09:57

Shmuel wrote:
Tue 05 Jun, 2018 06:27
использование члена StartSortOrder в новом качестве - как набор флагов (надо будет его переименовать в StartSortFlags), а его младший бит для обратной совместимости использовать по прежнему назначению
Это breaking change. Лучше просто StartSortFlags (и не забывать проверять StructSize прежде чем его читать/писать).

Shmuel
Posts: 5541
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 183 times

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

Post by Shmuel » Tue 05 Jun, 2018 10:10

DrKnS wrote:
Tue 05 Jun, 2018 09:57
Это breaking change
На уровне сорс-кода - да. На уровне уже скомпилированных старых бинарников, учитывая описание в Энциклопедии - нет.
Я в общем-то не настаиваю. Но эта структура и так имеет много членов, хотелось обойтись без добавления ещё одного. Может быть добавить новые флажки в Flags ?

User avatar
zg
zero-gravity
Posts: 5497
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 73 times
Contact:

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

Post by zg » Tue 05 Jun, 2018 10:27

может просто во время получения списка файлов запретить сортировку?

User avatar
DrKnS
Posts: 4940
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 164 times

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

Post by DrKnS » Tue 05 Jun, 2018 10:30

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

А, её же по идее только плагин заполняет.
Если не учитывать случай "межплагинового взаимодействия" - должно работать, да.

Shmuel
Posts: 5541
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 183 times

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

Post by Shmuel » Tue 05 Jun, 2018 10:43

zg wrote:
Tue 05 Jun, 2018 10:27
может просто во время получения списка файлов запретить сортировку?
Меня бы это устроило (по крайней мере, проблема, описанная в начальном посте темы, ушла бы).

User avatar
zg
zero-gravity
Posts: 5497
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 73 times
Contact:

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

Post by zg » Tue 05 Jun, 2018 10:48

5226.

Shmuel
Posts: 5541
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 21 times
Been thanked: 183 times

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

Post by Shmuel » Tue 05 Jun, 2018 11:46

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

Post Reply

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