Страница 1 из 1
Пытаюсь ускорить редактор
Добавлено: 29.11.24 19:20
смотритель
Как обычно, на 5 минут и завяз.
Как устроены вызовы?
Код: Выделить всё
PetTrees.RefreshHandler()
если ~IsCallFromSequencer() то
sequencer.ScheduleEvent(сам.RefreshHandler, sender, data);
иначе
AddNodes
tree.Acquire;
...
editor.text.AcquireRead;
AddNodes(rootNode, diagnostics, log);
editor.text.ReleaseRead;
tree.Release;
AddNodes - перекрыта в ИСР_деревоРазбораМодуля.ДеревоМодуля:
AddNodes^
ИСР_ДеревоРазбораМодуля.ДеревоМодуля.Refresh(parent) (* не перекрыта *)
что-то до
module := RefreshWorkOfPETPanelProcVar()
дальше добавляем отсюда узлы
RefreshWorkOfPETPanelProcVar := ИСР.RefreshWorkOfPETPanelProc
RefreshWorkOfPETPanelProc -
petPanel.RefreshWorkOfPETPanelInner()
она-то и вызывает парсер.
Re: Пытаюсь ускорить редактор
Добавлено: 29.11.24 19:23
смотритель
Очевидно, что не разорвав блокировку на самом дне стека, мы ничего не добъёмся.
Значит, именно тут надо разбить на две части, и видимо дальше вверх по стеку тоже, не считая того, что
можно сделать в отдельном потоке.
Re: Пытаюсь ускорить редактор
Добавлено: 29.11.24 20:11
смотритель
Т.е. получается, что рвать надо все уровни, но постораемся построить рядом наши костыли.
Рвать надо начинать снизу и двигаться вверх и сверху вниз. Короче, во все стороны сразу.
* ИСР_ДеревоРазбораМодуля.ДеревоМодуля.RefreshHandler будет перекрыт и он будет только копировать текст и инициировать процесс фонового разбора файла.
* по окончанию фонового разбора файла ФоновыйПарсер отправляет в очередь событие PETTrees.RefreshHandlerПродолжение, в котором передаёт разобранный модуль
* ✓ почти всё, что сейчас делается в PETTrees.RefreshHandler, будет перенесено в ДеревоМодуля.RefreshHandlerПродолжение
* ✓ всю ересь про параметры стираем
* в том месте, где сейчас вызывается RefreshWorkOfPETPanelProcVar, будет вызываться она же, но новая процедура будет только лишь возвращать разобранный результат.
Re: Пытаюсь ускорить редактор
Добавлено: 30.11.24 00:49
смотритель
Вроде сделал, помимо косяков в известных местах, дело решил косяк рядом.
Re: Пытаюсь ускорить редактор
Добавлено: 03.12.24 00:18
смотритель
Только показалось, что всё сделал. В итоге на данный момент всё откатил и только в одном месте вроде бы поправил работу с таймером (он отключался не там, где надо). Время покажет, хватит ли этого для прекращения зависаний. Во всяком случае, нашёл способ печатать очередь сообщений в момент, когда она переполняется и от этого система решает её удлиннить.
Re: Пытаюсь ускорить редактор
Добавлено: 13.12.24 15:18
смотритель
Попробовал ещё способ (его не смог бы придумать, если бы раньше не разобрался, как оно работает). Посмотрим, что будет.
Но по ходу есть ещё одна идея - смотреть на длину очереди сообщений в секвенсере, и, если она велика, то обрывать текущую перерисовку. Может быть, это сделает, чтобы редактор не только не зависал, но и быстрее отзывался. Хотя дерево будет "мерцать", ну и пусть. Надо будет попробовать.
Re: Пытаюсь ускорить редактор
Добавлено: 13.12.24 23:56
смотритель
Сообщения идут как минимум от абстрактного устройства клавиатуры в оконный менеджер, оттуда спускаются компоненту, он может его отправлять подкомпонентам (или одному подкомпоненту, имеющему фокус). Надо ещё выяснить, на каком этапе оно застревает.