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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с двумя потоками 
V
    Опции темы
ceZam
Дата 2.11.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте,
Есть основная форма. В ней есть три ListBoxа и пара кнопок. Работа с формой непосредственно ведется в одном потоке, а основной метод, из-за его вынужденного постоянного работоспособного состояния, выполняется во втором потоке. Суть вопроса в следующем: по мере выполнения этого самого метода, цепляющего в своей работе до тучи еще всяких разных методов, должны заполняться ListBoxы, но этого заполнения не происходит...
При этом в боксы запись производится не только в основном методе, но и в цепляемых...
PM MAIL   Вверх
KuMa1104
Дата 2.11.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Цитата(ceZam @  2.11.2009,  21:51 Найти цитируемый пост)
 Работа с формой непосредственно ведется в одном потоке, а основной метод, из-за его вынужденного постоянного работоспособного состояния, выполняется во втором потоке.


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

Конечно я понемаю что хочеться быстренько задать вопрос и получить чёткий ответ. Но так получаеться невсегда.

Ты сам сказал, что  
Цитата(ceZam @  2.11.2009,  21:51 Найти цитируемый пост)
 по мере выполнения этого самого метода, цепляющего в своей работе до тучи еще всяких разных методов

так как я должен угадать что именно там в этих методах не так??

Это вообще ужас
Цитата(ceZam @  2.11.2009,  21:51 Найти цитируемый пост)
При этом в боксы запись производится не только в основном методе, но и в цепляемых...


Глупа годать на кофейной гуще, приведи чёткую структуру своего кода, тогда поговорим.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
tol05
Дата 3.11.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 36
Всего: 170



я так понимаю,  ceZam, Вы WinForms приложение имеете в виду?

Дело в том, что любое обращение к WinForms должно всегда происходить из того же потока, который эти контролы (и форму, соответственно) создает. Наверняка Вы сталкивались с аттрибутом STAThread в коде своего приложения?

Так вот, если основной поток формы в какой-то момент запускает дополнительный поток (скажем customThread), то любой код любого метода, выполняющийся в customThread, для обращения к контролам и\или форме должен использовать технологию Invoke (для WinForms) или Dispatcher (для WPF)

Т.о. Вам следует почитать о:
- методе Control.Invoke()
- свойстве Control.InvokeRequired
ну или о компоненте System.ComponentModel.BackgroundWorker, который для подобных задач и был разработан несколько позднее, по многочисленным просьбам, если можно так выразиться )

P.S. само собой разумеется, для WPF читаем о классе System.Windows.Threading.Dispatcher



Это сообщение отредактировал(а) tol05 - 3.11.2009, 00:28


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ceZam
Дата 3.11.2009, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело все в том, KuMa1104, что методы работают как им положено работать, тобишь правильно. НО я пытаюсь консольное приложение перелопатить в WinForms... Таким образом и возник вопрос по поводу заменв строки:
Код

Console.WriteLine("Бла бла бла...");

Я думаю, tol05, мне скорее подойдет BackgroundWorker... сегодня буду с ним разбираться...
PM MAIL   Вверх
KuMa1104
Дата 3.11.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



tol05 поправте меня если я неправ.
Но компилятор лиш выдаст предупреждение что мол нельзя так делать, но сам текст в textbox всё равно выведет если не в debug идёт работа.

То что вы написали это конечно правильно, но мне кажеться что не совсем в этом дело.
Вот такои код хоть и некоректен но однако будет работать, и выведет в textbox сообщение

Код

 public partial class Form1 : Form
    {
        Thread TH;
        public Form1()
        {
            InitializeComponent();
            TH = new Thread(new ThreadStart(fnc));
            
        }

        public void fnc()
        {
            textBox1.Text = "вывожу текст в другом потоке";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            TH.Start();
        }
}

Максимум вовремя debug-инга получит исключение
Код

Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.

То что не появляеться текст, скорее всего что то гдето в другом месте нетак.

Всётаки там ведь
 
Цитата(ceZam @  2.11.2009,  21:51 Найти цитируемый пост)
по мере выполнения этого самого метода, цепляющего в своей работе до тучи еще всяких разных методов

думаю гдето там кроеться ответ.

ceZam Удачи)))



--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
tol05
Дата 3.11.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 36
Всего: 170



KuMa1104, это было всего-лишь мое предположение, поскольку информации действительно было мало.

Мне показалось, что фраза
Цитата(ceZam @  2.11.2009,  20:51 Найти цитируемый пост)
по мере выполнения этого самого метода... должны заполняться ListBoxы, но этого заполнения не происходит


как раз и подразумавала выброс того самого исключения.

Ну а то, что вне режима отладки приведенный Вами пример работает, в любом случае не означает, что он допустим на практике, не правда ли? ИМХО нужно не только стараться поощрять best practice, но и всячески пресекать bad practice )


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
KuMa1104
Дата 3.11.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



Цитата(tol05 @ 3.11.2009,  13:39)
KuMa1104, 
Ну а то, что вне режима отладки приведенный Вами пример работает, в любом случае не означает, что он допустим на практике, не правда ли? ИМХО нужно не только стараться поощрять best practice, но и всячески пресекать bad practice )

tol05 Я с Вами согласен, и этот скромный пример ни в коем мере не преследует цель к обучению плохим приёмам в програмировании, просто хотел показать автору топика что это в принципе возможно.

P.S.
Нужен код с примером. Так на словах угодать что нетак трудно.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
ceZam
Дата 4.11.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Действительно, KuMa1104, Вы правы... если запускать не из debug, то все работает нормальноsmile... Просто как заметил tol05:
Цитата

нужно не только стараться поощрять best practice, но и всячески пресекать bad practice ) 

Да и для себя хочется узнать немного больше чем я уже знаю))
PM MAIL   Вверх
KuMa1104
Дата 4.11.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: 1
Всего: 3



ceZam это здорово, но есть вопрос..
 Оно хоть заработало у тебя?


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
ceZam
Дата 4.11.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все проработало отлично... ну хотя почти... - У меня второй поток вызывает функцию и в конечном итоге второй поток как бы в бесконечном цикле оказывается... Короче говоря при закрытии формы второй поток так и продолжал работать))) - но на счет этого я вроде разобрался как быть)) А так все Боксы заполнились как надо))
PM MAIL   Вверх
ceZam
Дата 6.11.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Начал разбираться как связать второй поток с головным и напоролся на на еще один, тобишь третий поток, который объявляется вот так:
Код

handler.BeginReceive(buffer, 0, buffer.Length, 0,  new AsyncCallback(ReceiveCallback), handler);

Ну и у меня родился такой вопрос: Можно как-нибудь связать его хотя бы со вторым???

P.S.
Как Вы могли догадаться - это серверная часть, которая должна поддерживать интерфейс. В функции ReceiveCallback далее следует почти такой же вызов других принимающих и передающих функций, но вроде все они выполняются в одном и том же потоке.

Заранее спасибо.
PM MAIL   Вверх
ceZam
Дата 6.11.2009, 15:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сам задал вопрос и сам же нашел на него ответ))
Кому интересно вот ссылка на статью, которая мне очень помогла:
работа с потоками
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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