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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2012, 11:33   #1
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию Управление потоками, Form

Подскажите пожалуйста как правильно реализовать следующее:

Есть форма с textBox-ом,

Код:
....
....
private void Form1_Load(object sender, EventArgs e)
{
     Thread Tr = new Thread(Conn);
     Tr.Start();
     // потоки идут дальше
}

void Conn()
{
     textBox1.Text = "Не тот поток"; //Ошибка не тот поток
}
можно ли подключить тот поток где был реализован textBox1
или обновить делегатам как не будь?

Последний раз редактировалось Madmaxisss; 17.12.2012 в 12:04.
Madmaxisss вне форума Ответить с цитированием
Старый 17.12.2012, 18:55   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Менять контролы формы можно только в том потоке, в котором они были созданы. Чтобы выполнить Conn вым нужно вызвать у формы Invoke и передать теда делегат (в котором ипоменять текст).
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 18.12.2012, 07:46   #3
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию

В форме есть два textBox-а и одна кнопка, при запуске формы в первом текст боксе автоматически начинает набираться буква "а" при нажатие на кнопку во втором текст боксе начинает набираться буква "б" все работает одновременно как надо, но при закрытие приложения нужно выйти из методов window1 и window2 как это сделать?
Код:
....
public Form1()
        {
            InitializeComponent();
        }
        delegate void ddd(TextBox t);
        ddd ll1 = (TextBox t) => { t.Text += "a "; };
        ddd ll2 = (TextBox t) => { t.Text += "b "; };
        private void Form1_Load(object sender, EventArgs e)
        {
            new Thread(new ThreadStart(Window1)).Start();
        }

        void Window1()
        {
            while (true)
            {
                Thread.Sleep(200);
                textBox1.Invoke(ll1, textBox1);
                
                return; // как выйти из метода по закрытию приложения???
               
            }
        }

        void Window2()
        {
            while (Application.OpenForms["Form1"] != null) // не помогает, стоит задержка
            {
                Thread.Sleep(1000);
                textBox2.Invoke(ll2, textBox2);
            }
        }

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

Последний раз редактировалось Madmaxisss; 18.12.2012 в 07:49.
Madmaxisss вне форума Ответить с цитированием
Старый 18.12.2012, 10:01   #4
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Выбирайте любой вариант
1) Приложение само завершает потоки
http://msdn.microsoft.com/ru-ru/library/h339syd0.aspx

2) Заменить Sleep на ManualResetEvent.WaitOne и в форм closing делать set
http://msdn.microsoft.com/ru-ru/libr...esetevent.aspx

3) Создать глобальную переменную t потока в форм closing
Код:
  if (t.ThreadState == t.WaitSleepJoin)
    t.Interrupt();
t.Join();
в потоке завернуть все в трай катч
Код:
try
        {
            Thread.Sleep(1000);
        }
        catch(ThreadInterruptedException e)
        {

        }
Reskov вне форума Ответить с цитированием
Старый 18.12.2012, 15:15   #5
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию

благодарю, использовал IsBackground = true;
Madmaxisss вне форума Ответить с цитированием
Старый 03.02.2013, 04:06   #6
Cute Andy
Новичок
Джуниор
 
Регистрация: 03.02.2013
Сообщений: 2
Подмигивание InvokeRequired

Цитата:
Сообщение от Madmaxisss Посмотреть сообщение
Подскажите пожалуйста как правильно реализовать следующее:

Есть форма с textBox-ом,

Код:
....
....
private void Form1_Load(object sender, EventArgs e)
{
     Thread Tr = new Thread(Conn);
     Tr.Start();
     // потоки идут дальше
}

void Conn()
{
     textBox1.Text = "Не тот поток"; //Ошибка не тот поток
}
можно ли подключить тот поток где был реализован textBox1
или обновить делегатам как не будь?
Мне кажется так будет элегантнее :
if(textBox1.InvokeRequired)
{
textBox1.Invoke(new Action(delegate
{
textBox1.Text = "Success!";
}));
}
Cute Andy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление потоками процесса через сервис MIKE11IPME Общие вопросы Delphi 2 22.11.2012 21:54
Управление потоками vandrouny Win Api 12 04.01.2011 03:52
Можно ли подключить к web form windows form? Manonia Windows Forms 0 20.10.2010 05:28
Апплеты. управление потоками. (Java) Apteca Помощь студентам 0 30.05.2010 22:14
Управление потоками. Запуск, остановка, приоритет потока. metamfetamin Помощь студентам 5 11.11.2007 12:45