Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание TreeNode в отдельном потоке, от TreeView, к которому привязан 
:(
    Опции темы
Yama
Дата 9.1.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 2.8.2006

Репутация: нет
Всего: 2



Доброго времени суток!
Есть объект TreeNode, в который заносятся данные. Это занимает от 2 до 10 секунд. Как можно сделать, что бы соpдание TreeNode или работа treeView, к которому этот TreeNode привязан выполнялась в отдельном потоке, что-бы все приложение не зависало на время заполнения дерева.
Заранее спасибо.
--------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию.
PM MAIL   Вверх
Tror
Дата 9.1.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

Репутация: 2
Всего: 4



И тебе поздорову, добрый человек smile

ну вот что собсна у меня получилось. я думаю доработать под свои нужды уже сам сможешь

Код

    public partial class Form1 : Form
    {
        // наш поток который будет заполнять TreeView
        private Thread t;

        // делегат
        private delegate void AddNode(TreeNode node);
        
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(new ThreadStart(UpdateTreeView));
            t.Start();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        // генерируем ноды и добаляем в TreeView
        private void UpdateTreeView()
        {
            TreeNode n;
            Random r = new Random();

            for (int i = 0; i < 20000; i++)
            {
                n = new TreeNode(r.Next(1000).ToString());
                this.Invoke(new AddNode(AddNodeToTree), new object[] { n });
            }
        }

        // добавляем нод
        private void AddNodeToTree(TreeNode node)
        {
            treeView1.Nodes.Add(node);
            this.Text = node.Text;
        }

        // завершение программы
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            t.Abort();
            t = null;
        }
    }


Уважаемые гуру, я далек от мысли, что в предложенном мной варианте все правильно. Если будут какие-то замечания пишите.
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
mr.DUDA
Дата 9.1.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Добавлять узлы в дерево лучше пачкой, т.е. не Add а AddRange.


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 10.1.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Yama, хороший способ -- подгрузка данных по мере надобности.

Это, вроде, Lazy Load называется. Дуда про это рассказывал:

Цитата(mr.DUDA @  19.8.2006,  18:54 Найти цитируемый пост)
Всё очень просто. Изначально заполняется только корневой уровень дерева - т.е. узлы, входящие в самый первый уровень. Далее мы добавляем обработчик BeforeExpand в дерево, и в нём проверяем, какой узел раскрывается. Соответстенно данному узлу, мы получаем список элементов, входящих в узел. И добавляем их в TreeNode, тем самым после раскрытия узла производится подгрузка только M узлов, где N и M - совершенно разные по порядку значения (N - несколько десятков тысяч, а M - примерно 1...100 в среднем).

Тута 

С помощью этого можно сократить время загрузки дерева.

Так же по теме:
Цитата(Дрон @  21.8.2006,  16:30 Найти цитируемый пост)
Из моих наблюдений вот такой код
Код
TreeNode node = new TreeNode();
node.Text = "Preved!";

выполняется в разы медленней, чем
Код
TreeNode node = new TreeNode("Preved!");


Добавлено @ 17:32 
Так же полезно перед началом добавления вызывать методы: BeginUpdate, а по окончанию EndUpdate.

PM MAIL WWW ICQ   Вверх
Yama
Дата 10.1.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 2.8.2006

Репутация: нет
Всего: 2



Цитата(ivashkanet @  10.1.2007,  09:30 Найти цитируемый пост)
Yama, хороший способ -- подгрузка данных по мере надобности.

Это, вроде, Lazy Load называется. Дуда про это рассказывал:

ivashkanet,  я читал пост про lazy load, но этот способ не подходит, т.к. данные динамически меняются и необходимо их заносить в дерево полностью.
Tror, большое спасибо! сейчас буду прменять к своему приложению smile

--------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0831 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.