Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
-
смотритель
- Site Admin
- Сообщения: 46
- Зарегистрирован: 25.04.18 15:17
Сообщение
смотритель » 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()
она-то и вызывает парсер.
-
смотритель
- Site Admin
- Сообщения: 46
- Зарегистрирован: 25.04.18 15:17
Сообщение
смотритель » 29.11.24 19:23
Очевидно, что не разорвав блокировку на самом дне стека, мы ничего не добъёмся.
Значит, именно тут надо разбить на две части, и видимо дальше вверх по стеку тоже, не считая того, что
можно сделать в отдельном потоке.
-
смотритель
- Site Admin
- Сообщения: 46
- Зарегистрирован: 25.04.18 15:17
Сообщение
смотритель » 29.11.24 20:11
Т.е. получается, что рвать надо все уровни, но постораемся построить рядом наши костыли.
Рвать надо начинать снизу и двигаться вверх и сверху вниз. Короче, во все стороны сразу.
* ИСР_ДеревоРазбораМодуля.ДеревоМодуля.RefreshHandler будет перекрыт и он будет только копировать текст и инициировать процесс фонового разбора файла.
* по окончанию фонового разбора файла ФоновыйПарсер отправляет в очередь событие PETTrees.RefreshHandlerПродолжение, в котором передаёт разобранный модуль
* ✓ почти всё, что сейчас делается в PETTrees.RefreshHandler, будет перенесено в ДеревоМодуля.RefreshHandlerПродолжение
* ✓ всю ересь про параметры стираем
* в том месте, где сейчас вызывается RefreshWorkOfPETPanelProcVar, будет вызываться она же, но новая процедура будет только лишь возвращать разобранный результат.
-
смотритель
- Site Admin
- Сообщения: 46
- Зарегистрирован: 25.04.18 15:17
Сообщение
смотритель » 30.11.24 00:49
Вроде сделал, помимо косяков в известных местах, дело решил косяк рядом.
-
смотритель
- Site Admin
- Сообщения: 46
- Зарегистрирован: 25.04.18 15:17
Сообщение
смотритель » 03.12.24 00:18
Только показалось, что всё сделал. В итоге на данный момент всё откатил и только в одном месте вроде бы поправил работу с таймером (он отключался не там, где надо). Время покажет, хватит ли этого для прекращения зависаний. Во всяком случае, нашёл способ печатать очередь сообщений в момент, когда она переполняется и от этого система решает её удлиннить.