Управление TreeView и нерекурсия - PullRequest
2 голосов
/ 02 сентября 2010

Я могу заполнить элемент управления TreeView определенными ключами реестра, рекурсивно перечислив ключи реестра и поместив их в элемент управления TreeView;затем из соображений производительности я пытаюсь использовать нерекурсивный / итеративный подход для перечисления разделов реестра, но как я могу заполнить TreeView, поскольку «дерево» является естественно рекурсивным (по крайней мере, в моем понимании)?Является ли рекурсия единственным способом ее достижения?Кто-нибудь даст некоторые фрагменты кода / примеры или перенаправит меня на веб-страницы, чтобы объяснить этот вопрос?

Кстати, я программист на Delphi / Free Pascal, но объяснение языка программирования C / C ++ вообще не должно быть проблемой.Приветствия: -)

Я тоже спрашивал об этом в списке рассылки Free Pascal.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

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

Во-вторых, да, это можно сделать без рекурсии. Обычный способ - иметь некоторый контейнер для хранения данных, которые необходимо будет обработать, например, очередь или стек. Когда вы идете по дереву реестра, вы извлекаете данные, и когда / если вы встретите «подкаталог» в дереве, вы помещаете его в стек. Когда вы заканчиваете работу с текущим «каталогом», вы извлекаете следующий из стека / очереди / чего угодно и обрабатываете его таким же образом. Когда коллекция пуста, все готово.

1 голос
/ 02 сентября 2010

Если проблема в производительности, рассмотрите возможность отложенного заполнения TreeView. Начните с создания верхнего уровня дерева. Заполняйте каждый следующий уровень дерева только тогда, когда пользователь расширяет его. Это также должно решить проблему переполнения стека.

Здесь вы можете найти источники проекта Native Registry Editor, который вы можете использовать в качестве примера.

...