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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как из потока получать данные с формы 
:(
    Опции темы
MasterOfCode
Дата 28.11.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



Делаю так:
Код

public void Start()
{
    function.go(FileName_tb.Text); // Пишет что не может из потока обратиться к форме
}

public void Start_btn_Click(object sender, EventArgs e)
{
    System.Threading.Thread thread = new System.Threading.Thread(Start);
    thread.Start();
}

делал и так:
Код

public delegate string FileNameGet();
public string GetFileName()
{
    return FileName_tb.Text; //Пишет что не может из потока обратиться к форме
}
public void Start()
{
    Main_frm.FileNameGet GetFN = GetFileName;
    function.go(GetFN()); 
}

public void Start_btn_Click(object sender, EventArgs e)
{
    System.Threading.Thread thread = new System.Threading.Thread(Start);
    thread.Start();
}


Как мне передать параметры на запуск процедуры, ведь System.Threading.Thread thread = new System.Threading.Thread(Start); у старт нельзя указать с какими запускать... 
???


--------------------
user posted image
PM ICQ   Вверх
Partizan
Дата 28.11.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

Репутация: 18
Всего: 67



MasterOfCode, надо просто всю работу с UI проделывать в потоке, который его создал. через FileName_tb.Invoke(...) например...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
SpaceSpace
Дата 28.11.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нельзя обращатся к элементу формы их другого потока
используй Invoke

Код

private void RunMe()   
 {      
  myLabel.Text = "You pushed the button!";    
}

if (!InvokeRequired)    {        
myLabel.Text = "You pushed the button!";    
}    
else    
{        
Invoke(new ThreadStart(RunMe));    
}



--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
QryStaL
Дата 28.11.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

Репутация: 14
Всего: 32



МСДН почитайте
http://msdn.microsoft.com/en-us/library/sy...ing.thread.aspx

Добавлено через 4 минуты и 40 секунд
Цитата(SpaceSpace @  28.11.2008,  15:46 Найти цитируемый пост)
Нельзя обращатся к элементу формы их другого потока

Он вообще не об этом спрашивает


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
MasterOfCode
Дата 28.11.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



SpaceSpacePartizan, Спасибо. Понял. Вобщем обошел ситуацию так, просто создал переменную и туда передал значение, а потом от туда отправил в поток переменную.
типа так:
Код

public delegate string FileNameGet();
public string s;
public string GetFileName()
{
    return s; 
}
public void Start()
{
    Main_frm.FileNameGet GetFN = GetFileName;
    function.go(GetFN()); 
}
public void Start_btn_Click(object sender, EventArgs e)
{
    s = FileName_tb.Text;
    System.Threading.Thread thread = new System.Threading.Thread(Start);
    thread.Start();
}





--------------------
user posted image
PM ICQ   Вверх
SpaceSpace
Дата 28.11.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не ты ситуацию не обошел)
используй инвок если из другого потока стучишся к форме


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
MasterOfCode
Дата 28.11.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



Цитата(SpaceSpace @  28.11.2008,  18:00 Найти цитируемый пост)
Не ты ситуацию не обошел)

Работает же smile


--------------------
user posted image
PM ICQ   Вверх
SpaceSpace
Дата 28.11.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
QryStaL
Дата 28.11.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

Репутация: 14
Всего: 32



Цитата(SpaceSpace @  28.11.2008,  16:13 Найти цитируемый пост)
используй параметризированный делегат для потока

Про это я дал ссылку в предыдущем сообщении, но MasterOfCode ее проигнорировал  smile 


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
EgoBrain
Дата 30.11.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SpaceSpace @ 28.11.2008,  16:00)
Не ты ситуацию не обошел)
используй инвок если из другого потока стучишся к форме

Можно пример, как состояние формы изменить из другого потока  smile  ? Например как в ListBox строку добавить. smile
PM MAIL ICQ Skype   Вверх
nagg
Дата 30.11.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(EgoBrain @ 30.11.2008,  09:20)
Цитата(SpaceSpace @ 28.11.2008,  16:00)
Не ты ситуацию не обошел)
используй инвок если из другого потока стучишся к форме

Можно пример, как состояние формы изменить из другого потока  smile  ? Например как в ListBox строку добавить. smile

в не-UI'ном потоке:


listBox.Invoke((MethodInvoker)( () =>
{

 // всё, написаноое тут будет работать в юайном потоке
 listBox.Items.Add("Item"); 

}
));


--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
MasterOfCode
Дата 30.11.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



Цитата(EgoBrain @  30.11.2008,  11:20 Найти цитируемый пост)
Можно пример, как состояние формы изменить из другого потока  smile  ? Например как в ListBox строку добавить. smile 


Что то типа этого:
Код

public partial class Form1 : Form
    {
        public class MyThread
        {
            public static ListBoxChangeDelegate lbc = null;
            public static void Start()
            {
                for (int i = 0; i < 10; i++)
                {
                    if (lbc != null)
                    {
                        lbc(i.ToString());
                    }
                }
            }
        }
        public delegate void ListBoxChangeDelegate(string AddString);
        public void ChangeListBox(string AddString)
        {
            if (listBoxForChange.InvokeRequired)
            {
                ListBoxChangeDelegate lbc = new ListBoxChangeDelegate(ChangeListBox);
                listBoxForChange.Invoke(lbc, AddString);
            }
            else
            {
                listBoxForChange.Items.Add(AddString);
            }
        }
        public Form1()
        {
            InitializeComponent();
        }

        

        private void button1_Click(object sender, EventArgs e)
        {
            MyThread.lbc = ChangeListBox;
            System.Threading.Thread thread = new System.Threading.Thread(MyThread.Start);

            thread.Start();
        }
    }



--------------------
user posted image
PM ICQ   Вверх
Partizan
Дата 30.11.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

Репутация: 18
Всего: 67



MasterOfCode, перечитал первый топик...похоже вам действительно надо посмотреть параметризованный ThreadStart


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
EgoBrain
Дата 1.12.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MasterOfCode @ 30.11.2008,  14:26)
Что то типа этого:
Код

public partial class Form1 : Form
    {
        public class MyThread
        {
            public static ListBoxChangeDelegate lbc = null;
            public static void Start()
            {
                for (int i = 0; i < 10; i++)
                {
                    if (lbc != null)
                    {
                        lbc(i.ToString());
                    }
                }
            }
        }
        public delegate void ListBoxChangeDelegate(string AddString);
        public void ChangeListBox(string AddString)
        {
            if (listBoxForChange.InvokeRequired)
            {
                ListBoxChangeDelegate lbc = new ListBoxChangeDelegate(ChangeListBox);
                listBoxForChange.Invoke(lbc, AddString);
            }
            else
            {
                listBoxForChange.Items.Add(AddString);
            }
        }
        public Form1()
        {
            InitializeComponent();
        }

        

        private void button1_Click(object sender, EventArgs e)
        {
            MyThread.lbc = ChangeListBox;
            System.Threading.Thread thread = new System.Threading.Thread(MyThread.Start);

            thread.Start();
        }
    }

Спасибо. А что мы тут делаем?
PM MAIL ICQ Skype   Вверх
MasterOfCode
Дата 1.12.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



EgoBrain, создаем поток и из него изменяем компонент на форме (листбокс)


--------------------
user posted image
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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