|
Вопрос # 1 247/ вопрос открыт / |
|
Здравствуйте!
Пытаюсь запустить цикл(приложение), который работает с TTreeView, но программа виснет. Нужно выполнить действие над каждым потомком узла n. В чем ошибка?
Приложение: Переключить в обычный режим- procedure TForm1.Us(k: string; n:TTreeNode);
- var
- curitem: TTreeNode;
- begin
- curitem :=n.getFirstChild;
- while curitem <> nil do
- begin
-
- curitem:=n.GetNextChild(n);
- end;
- end;
 |
Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 29 декабря 2007, 18:08
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Трофимов Евгений!
Давайте подумаем, почему программа "виснет". На самом деле она не виснет. просто она занята расчётами, которые вы ей дали и не обрабатывает сообщеие от операционной системы на отрисовку. Наиболее простой вариант решить - вставить в цикле вызовы Application.ProcessMessages; Работу это не ускорит, но у приложения появиться некоторая "отзывчивость". Если это что бы сделать на один раз - сойдёт. Но как профисиональное решение - неправильное.
Почему же всё таки она "тормозит"? варианты такие. У вас много элементов. но на среднестатистическом компьютере это начнёт проявляться где то при 100-200 элементах. Во вторых, сама процедура обработки элемента может быть сложной(например вы пингуете хосты или файлы скачиваете). Тут уже сами смотрите на свой код и ускоряйте.
Но это всё костыли. Правильно такая задача решается разделением вида и модели. TreeView - это вид. Он предзначен для отображения и всё! ничего больше. А модель - отдельный набор процедур должен заниматься обработкой. И сделать эту обработку лучше в отдельном потоке.
Взаимодействуют они между собой двумя способами. В первом, после нажатия кнопки, запускается поток, который занимается расчётами, и с помощю сообщений уведомляет вид о необходимых изменениях. Об этом способе вы можете почитать в моей статье о том, как качать файлы с интернета. Для средних приложений - самое оно. Ещё раз повторюсь. Поток занимается расчётом и время от времени посылает сообщения о необходимости отрисовки с информацией, что именно надо отрисовать. Если правильно сделать, то вид (у вас это тревю с другими элементами формы) может и проигнорировать требования отрисовки(Ну например приложения свёрнуто - смысл обновлять интерфейс).
Но самый правильный способ - воспользоваться виртуальным тревю. Поток делает расчёты и складыват всё в какой-нибуть класс. а вид время от времени (или просто по сообщению от модели "отрисуюсь") делает просмотр класса и отрисовывает себя. При этом модель абсолютно "не в курсе" какой у неё вид. А вид ничего о модели. Они в курсе только о связующем классе. Это позволить упростить программирование (принцип "разделяй и владей"). Скачать компонент для виртульного тревю можно тут http://www.soft-gems.net/ - он бесплатен.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 29 декабря 2007, 21:18
Оценка за ответ: 5
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|