LINUX.ORG.RU

История изменений

Исправление den73, (текущая версия) :

Я вот что понял: мы упираемся в две вещи. Если делаем жёстко синхронный режим, то должны висеть на сокете. Т.е. среда зависнет при долгом молчании сервера. Это недопустимо, т.к. чревато падением среды и потерей несохранённых файлов. Среда падать не должна. А раз мы не висим на сокете, то цикл обработки событий неизбежно работает и мы не сможем гарантировать синхронность между запросом на список листьев и возвратом из запроса. Т.е. сценарий b в том, что я написал (кстати, код здесь) не должен работать (хотя на вид работает).

Поэтому можно такой вариант сделать: У поддерева есть 4 состояния: неизвестно, ждём, заполняем, заполнили.

Первое состояние - «неизвестно». При запросе списка листьев вставляем лист со словом «ждите» и ставим состояние «ждём». Возвращаем управление - пусть tablelist раскроет список и покажет этот элемент. Не вставить элемент «ждите» нельзя, поскольку исчезнет треугольничек. В то же время асинхронно отправляем запрос на список листьев на сервер. По приходу списка листьев с сервера ставим состояние поддерева «заполняем», удаляем лист со словом «ждите» и заполняем настоящими данными. Ставим состояние «заполнено». Здесь мы всё делаем синхронно и проблем возникнуть не должно. Если список листьев пришёл, а состояние уже «заполняем» или «заполнено», то выбрасываем этот список. Слава Богу, у нас локалы должны каждый раз быть одинаковыми.

Это был сценарий b.

Сценарий a всё же представляет трудность. Но можно бросить мультибумеранг, а именно ставить на after idle (или во вторую очередь, или через таймер) скрипт следующего содержания:

if {поддерево $x заполнено} {
  искать в нём
} else {
  after idle тот-же-скрипт
}

Тогда поиск зависнет до момента заполнения дерева, и при этом вся система не будет висеть.

Как-то так. Во всяком случае, мы тут избавляемся от необходимости ставить какое-либо продолжение на возврат списка значений и можем убрать очереди продолжений.

Верно я мыслю?

Исходная версия den73, :

Я вот что понял: мы упираемся в две вещи. Если делаем жёстко синхронный режим, то должны висеть на сокете. Т.е. среда зависнет при долгом молчании сервера. Это недопустимо, т.к. чревато падением среды и потерей несохранённых файлов. Среда падать не должна. А раз мы не висим на сокете, то цикл обработки событий неизбежно работает и мы не сможем гарантировать синхронность между запросом на список листьев и возвратом из запроса. Т.е. сценарий b в том, что я написал (кстати, код здесь) не должен работать (хотя на вид работает).

Поэтому можно такой вариант сделать: У поддерева есть 4 состояния: неизвестно, ждём, заполняем, заполнили.

Первое состояние - «неизвестно». При запросе списка листьев вставляем лист со словом «ждите» и ставим состояние «ждём». Возвращаем управление - пусть tablelist раскроет список и покажет этот элемент. Не вставить элемент «ждите» нельзя, поскольку исчезнет треугольничек. В то же время асинхронно отправляем запрос на список листьев на сервер. По приходу списка листьев с сервера ставим состояние поддерева «заполняем», удаляем лист со словом «ждите» и заполняем настоящими данными. Ставим состояние «заполнено». Здесь мы всё делаем синхронно и проблем возникнуть не должно. Если список листьев пришёл, а состояние уже «заполняем», или «заполнено» то выбрасываем этот список. Слава Богу, у нас локалы должны каждый раз быть одинаковыми.

Это был сценарий b.

Сценарий a всё же представляет трудность. Но можно бросить мультибумеранг, а именно ставить на after idle (или во вторую очередь, или через таймер) скрипт следующего содержания:

if {поддерево $x заполнено} {
  искать в нём
} else {
  after idle тот-же-скрипт
}

Тогда поиск зависнет до момента заполнения дерева, и при этом вся система не будет висеть.

Как-то так. Во всяком случае, мы тут избавляемся от необходимости ставить какое-либо продолжение на возврат списка значений и можем убрать очереди продолжений.

Верно я мыслю?