Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Создание TreeNode в отдельном потоке


Автор: Yama 9.1.2007, 18:19
Доброго времени суток!
Есть объект TreeNode, в который заносятся данные. Это занимает от 2 до 10 секунд. Как можно сделать, что бы соpдание TreeNode или работа treeView, к которому этот TreeNode привязан выполнялась в отдельном потоке, что-бы все приложение не зависало на время заполнения дерева.
Заранее спасибо.

Автор: Tror 9.1.2007, 21:15
И тебе поздорову, добрый человек 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;
        }
    }


Уважаемые гуру, я далек от мысли, что в предложенном мной варианте все правильно. Если будут какие-то замечания пишите.

Автор: mr.DUDA 9.1.2007, 22:48
Добавлять узлы в дерево лучше пачкой, т.е. не Add а AddRange.

Автор: ivashkanet 10.1.2007, 09:30
Yama, хороший способ -- подгрузка данных по мере надобности.

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

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

http://forum.vingrad.ru/index.php?showtopic=108480

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

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

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


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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)