Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 05:42   #1
tigrend
Пользователь
 
Регистрация: 10.04.2010
Сообщений: 31
По умолчанию Два потока

Представляем себе ситуацию: два потока (главный и вторичный). В главном функция, и делегат к ней.
Нужно из вторичной вызвать функцию. Как это сделать?
Код:
class MainThread
{
...
        public delegate void AddNodes(TreeNode tn); 

        public void AddNode(TreeNode tn)
        {
            if (this.treeView1.InvokeRequired)
            {
                AddNodes d = new AddNodes(this.AddNode);
                this.Invoke(d, new object[] { tn });
            }
            else
            {
                treeView1.Nodes.Add(tn);
            }
        }
...
}

class SecondThread
{

        private void TreeNumbers()
        {
            TVD.Nodes.Clear();//TreeViewlink
            for (i = 0; i < 10000; i += 100)
            {
                TreeNode newNode = new TreeNode();
                newNode.Name = "" + i;
                newNode.Text = "" + i;

                Form1.AddNodes n = new Form1.AddNodes(Form1.AddNode);
//Ошибка Для нестатического поля, метода или свойства "Form1.AddNode(System.Windows.Forms.TreeNode)" требуется ссылка на объект Work.cs

                n(newNode);
                //TVD.Nodes.Add(newNode);//не работает
            }
        }
}

Последний раз редактировалось Stilet; 22.04.2010 в 07:34.
tigrend вне форума Ответить с цитированием
Старый 22.04.2010, 07:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я может не в свою коврижку лезу, но почему бы тебе не посмотреть в MSDN примеры, где будет такая строка:
Код:
 treeView1.Nodes.Add(new TreeNode(customer2.CustomerName));
Ато уж больно ты как-то заумно добавляешь ветки...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.04.2010, 08:07   #3
tigrend
Пользователь
 
Регистрация: 10.04.2010
Сообщений: 31
По умолчанию

Нууу если бы мне было дозволено из второго потока добавлять ветви в дерево первого потока, то и проблем бы не было. А так нужна межпоточность. И в одном потоке у меня отлично получается справляться в дереве, а в разных никак.
И я смотрел пример по потокобезопасному вызову элементов, но они там не передавали параметры при вызове функции.
tigrend вне форума Ответить с цитированием
Старый 22.04.2010, 10:13   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1.
Код:
class SecondThread
{

        private void TreeNumbers()
        {
            TVD.Nodes.Clear();//TreeViewlink
            for (i = 0; i < 10000; i += 100)
            {
                TreeNode newNode = new TreeNode();
                newNode.Name = "" + i;
                newNode.Text = "" + i;

                Form1.AddNodes n = new Form1.AddNodes(Form1.AddNode);
//Ошибка Для нестатического поля, метода или свойства "Form1.AddNode(System.Windows.Forms.TreeNode)" требуется ссылка на объект Work.cs

                n(newNode);
                //TVD.Nodes.Add(newNode);//не работает
            }
        }
}
Подобные операции не требуют много времени процессора, а поэтому нет никакого смысла их располагать в отдельном потоке.
2. Чтобы из дочернего потока выполнить код в главном, пишем просто
Код:
Dispatcher.BeginInvoke(() => { /*something is here*/ });
Здорово не так ли ?
BOBAH13 вне форума Ответить с цитированием
Старый 22.04.2010, 10:30   #5
tigrend
Пользователь
 
Регистрация: 10.04.2010
Сообщений: 31
По умолчанию

согласен здорово.
и согласен что не занимают много времени.
Но я так же не вижу смысла, в выполнении одной процедуры во вторичном потоке, затем снова в первичном, затем снова во вторичном, а затем ещё одну в первичном и затем ещё две длительных операции во вторичном. Согласитесь это только усложнит всё (программа читает очень много и последние операции чтения вообще циклические, так что это очень очень много времени, а оттуда данные надо пихать в форму. просто потому что дерево это удобно).
А так у нас во вторичном будет прямая как стрела программа, которая в первичный будет обращаться только за тем, чтобы записать данные.
tigrend вне форума Ответить с цитированием
Старый 22.04.2010, 19:08   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Так, вообщем как выполнить из дочернего потока в главном какие то действия с каким то данными главного потока (аля контролы) ответ дан, что не устраивает или в чем проблема, прошу расписать конкретней ?
BOBAH13 вне форума Ответить с цитированием
Старый 24.04.2010, 08:25   #7
tigrend
Пользователь
 
Регистрация: 10.04.2010
Сообщений: 31
По умолчанию

Я где то сказал что меня чтото не устраивает?
tigrend вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В среде Delphi составить программу (процесс), который паралельно запускает два потока (нити) metamfetamin Помощь студентам 9 06.11.2007 15:26
микшер на два потока в проигрывателе музыки. проигрыватель сделан на основе библиотеки Bass.dll D-fens Мультимедиа в Delphi 4 08.06.2007 20:36
два TMediaPlayer и два AVI-файла zeleniy Компоненты Delphi 0 01.06.2007 14:14