Page 1 of 1

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

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

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

Posted: Sun 03 Jun, 2018 22:15
by DrKnS
У меня например не производится.

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

Posted: Mon 04 Jun, 2018 01:04
by Shmuel
Хорошо, может быть я ошибаюсь (не исключено).

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

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

Если есть желание исследовать - можно это сделать вместе, в форуме или вне его.

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

Posted: Mon 04 Jun, 2018 08:45
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.

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

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

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

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

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

Posted: Mon 04 Jun, 2018 10:33
by Shmuel
Ещё вариант - расширить структуру OpenPanelInfo, добавив новый член StartSortFlags, где можно было бы задавать дополнительные параметры начальной сортировки. В этом случае вызов FCTL_SETDIRECTORIESFIRST не понадобился бы.

P.S. Или добавить новые флажки прямо в существующее поле Flags.

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

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

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

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

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

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

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

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

Posted: Tue 05 Jun, 2018 10:27
by zg
может просто во время получения списка файлов запретить сортировку?

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

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

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

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

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

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

Posted: Tue 05 Jun, 2018 10:48
by zg
5226.

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

Posted: Tue 05 Jun, 2018 11:46
by Shmuel
zg wrote: Tue 05 Jun, 2018 10:485226
Спасибо, работает как надо.