Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 37

Заполнение TreeView деревом папок на ПК. Как избежать зависаний формы

02.09.2012, 15:40. Показов 6233. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, у меня такой вопрос:

Есть приложение WindofsForms на нем элемент TreeView. При загрузке формы в нем отображаются жесткие диски и их файлы и папки. Поскольку их много, то форма блокируется до окончания операции. Подскажите плиз как можно сделать заполнение асинхронным без блокировки формы

Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2012, 15:40
Ответы с готовыми решениями:

Обход всех папок и заполнение TreeView
Есть лаба: Реализовать просмотр реестра. Никак не могу заполнить элемент TreeView. Предположим, мне нужно получить все элементы из...

Создание формы с деревом каталогов Outlook для удаления из выбранных папок непрочитанных писем
Привет всем. Необходимо создать форму, на которой динамически строить дерево папок Outlook из элементов CheckBox. Для изменения...

Как восстановить данные с HDD вместе с деревом папок
Доброго всем здравия! Имеется жётский диск, разбитый на два тома. В один прекрасный день начал жутко тормозить при обращении к...

8
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
02.09.2012, 19:23
vadimka1234, может очередной узел заполнять только при клике по нему? И не на всю вложенность подкаталогов, а только первого уровня?
0
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 37
02.09.2012, 20:11  [ТС]
Как вариант думаю да. Но все равно хотелось бы понять как это сделать именно первым способом. Опыт у меня не большой. Я это себе представлял примерно так: Создать дополнительный поток и в нем вызывать функцию для формирования treeview через Control.BeginInvoke, но все равно форма остаются залоченой. Может быть можно как-то по другому, поскольку я такое уже видел в других приложениях.
0
 Аватар для XIST
1960 / 1070 / 148
Регистрация: 01.10.2009
Сообщений: 3,590
Записей в блоге: 1
02.09.2012, 20:16
VB.NET
1
Application.DoEvents
?
0
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 37
03.09.2012, 12:18  [ТС]
Кажется это то,что нужно спасибо всем, буду пробовать.

Добавлено через 15 часов 47 минут
К сожалению DoEvents не подошло так как из-за него форма мирцает, поэтому я стал делать так

Для формирования дерева я использую следующую функцию- она рекурсивно пробегает все каталоги на дисках компьютера, для обновления UI использую функцию tree_update(см ниже)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void form_tree(TreeNode node,DirectoryInfo dir_info)
        {
 
            foreach(DirectoryInfo dir in dir_info.GetDirectories())
            {
 
                try
                {
                    Form_List_MyComputer dlg = new Form_List_MyComputer(tree_update);
                    
                    TreeNode dir_node = new TreeNode(dir.Name);
 
 
                    //обновляем дерево
                    this.Invoke(dlg, new object[] { (TreeNode)node, (TreeNode)dir_node, dir.Name.ToString(), dir.FullName.ToString() });
 
                    //вызываем функцию снова
                    form_tree(dir_node, dir);
                }
                catch (UnauthorizedAccessException un_ex)
                {
                    //MessageBox.Show("need special rights for accessing this directory");
                }
                
 
            }
 
 
        }


функция tree_update

C#
1
2
3
4
5
6
        public void tree_update(TreeNode node,TreeNode child_node, string node_name, string full_name)
        {
            //TreeNode dir_node = new TreeNode(node_name);
            child_node.Name = full_name;
            node.Nodes.Add(child_node);
        }

В результате дерево формируется но UI блокируется. Почему так происходит?

Спасибо.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.09.2012, 21:19
Формируйте родительскую ноду (а-ля Мой Компьютер) в отдельном потоке, а в основном всего лишь цепляйте ее к дереву.
Удобнее всего это делать с помощью BackgroundWorker'a:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void button_click(object sender, EventArgs e)
{
   TreeNode root = new TreeNode("My Computer");
   backgroundWorker.RunWorkerAsync(root);
}
 
void worker_DoWork(object sender, DoWorkEventArgs e)
{
   var worker = sender as BackgroundWorker;
   var root = e.Argument as TreeNode;
   // Дальше идет построение дерева. Можно сообщать о прогрессе вызовом worker.ReportProgress
}
 
void worker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   treeView.Nodes.Add(e.Result as TreeNode);
}
1
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 37
04.09.2012, 13:42  [ТС]
Насколько я понимаю в данном случае форма блокироваться не будет, но дерево будет оставаться пустым до окончания операции, поэтому я стал использовать ProgressChanged. Если я все правильно понял, то в обработчике DoWork у меня формируется дерево:

C#
1
2
3
4
5
6
7
8
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
 
            TreeNode my_pc_ = new TreeNode("My_PC");
            get_drives(my_pc_);
 
          
        }
функция get_drives получает жесткие диски на компе и вызывает функцию пробегающую все под каталоги- get_child_dirs.

Вот эти функции:


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void get_drives(Treenode my_pc)
        {
            drives = DriveInfo.GetDrives();
            TreeNode my_pc = new TreeNode("My_Pc");
            foreach (DriveInfo drive in drives)
            {
 
                try
                {
                    my_pc.Nodes.Add(dribe_node);
                    DirectoryInfo dir = drive.RootDirectory;
 
 
                    get_child_dirs(dir, dribe_node);
                }
                catch (UnauthorizedAccessException ex)
                {
                }
 
            }
                
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        private void get_child_dirs(DirectoryInfo dir_info, TreeNode parent_node)
        {
 
            foreach (DirectoryInfo dir in dir_info.GetDirectories())
            {
 
                try
                {
                    TreeNode child_node = new TreeNode(dir.Name);
                    parent_node.Nodes.Add(child_node);
                      //Рекурсивный вызов функции
                    get_child_dirs(dir,parent_node);
 
                }
                catch (UnauthorizedAccessException un_ex)
                {
                    //MessageBox.Show("need special rights for accessing this directory");
                }
 
                
            }
 
 
        }
Теперь Главная нода создается и рекурсивно заполняется в отдельном потоке. Как я понимаю в обработчике ProgressChanged надо цеплять ее к дереву. Я пока не могу понять как ее достать из dowork

Спасибо.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.09.2012, 13:44
Цитата Сообщение от vadimka1234 Посмотреть сообщение
Как я понимаю в обработчике ProgressChanged надо цеплять ее к дереву.
Не советую - интерфейс будет обновляться на каждом узле = тормоза.
Лучше добавьте прогресс бар и обновляйте его - чтобы пользователь видел, что идет некая работа.
0
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 37
04.09.2012, 16:38  [ТС]
Наверное вы правы, я уже реализовал по другому. Хотелось бы уже чисто для академических познаний понять как сделать именно таким способом. Проблема в том что я не знаю как передать узел созданный в одном потоке- дереву в другом.

Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.09.2012, 16:38
Помогаю со студенческими работами здесь

DataGridView: заполнение в отдельном потоке во избежание зависаний
Добрый день. Как заполнить dataGridView, чтобы не зависала форма? Записей в ней более 300000 и форма грузится около 5 секунд. Данные...

Как избежать назначения владельцем файлов/папок при смене ж. дисков
Суть проблемы. Работая на одном компьютере появилась необходимость переставить жесткий диск на другой компьютер. Однако там меня поджидал...

Как в Treeview добавить отображение папок
как Treeview добавить папки

TreeView дерево папок. Как перейти к определенной папке
Доброго времени суток. Нужно создать форму со списком папок и файлов в TreeView. В сети нашел решение. Imports...

Как избежать повторной отправки формы?
Пробовала после получения данных формы и их обработки header('Location: /file.php'); но выдает ошибку - Cannot modify header information -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru