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

Поиск:

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


Бывалый
*


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

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



Изучаю .net. Решил поэксперементировать с многопотчностью. Кинул на форму кнопку и лэйбл. По нажатию кнопки создается поток, в котором вызывается метод, в цикле меняющий текст лэйблы на значение перемнной цикла. Мне выдало ошибку, что нельзя использовать компонент, созданый в другом потоке. Я исправил все, как было написано в MSDN (создал в новом потоке делегат, связал его со своим методом и вызвал через form.BeginInvoke()). Работает, но пока метод не выплниться - нельзя ничего делать с формой. Внимание, вопрос: как сделать новый поток фоновым, то есть чтобы у меня была возможность клацать другие кнопки, пока лэйбла меняет свои значения??

Это сообщение отредактировал(а) Alfmaster - 26.9.2008, 00:05
PM MAIL   Вверх
mihryak
Дата 26.9.2008, 19:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. Контролы можно менять только в основном потоке, нажимать на них и прочими образами взаимодействовать со стороны юзера - тоже
2. BeginInvoke переводит выполнение из созданного тобой потока в основной
3. Ты в цикле непрерывно опосредованно нагружаешь основной поток
4. Основной поток на то и основной, чтобы быть одним, так что с твоей нагрузкой никакие другие пользовательские операции будут практически недоступны

Попробуй нагружать основной поток поменьше, ну в самом деле - зачем тебе сотни раз в секунду обновлять лабел? Вставь в тело цикла Thread.Sleep(500);
PM MAIL ICQ   Вверх
Alfmaster
Дата 27.9.2008, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Справился с проблемой.
Код

delegate void d();
int n = 0;
        void stmet()
        {
            d t = new d(TextWriter);
            for (int i = 0; i < 10; i++)
            {
               
                
                n = (int)i;
                
                this.Invoke(t);
                Thread.Sleep(1000);
            }
        }

private void TextWriter()
        {
            label1.Text = n.ToString();
        }


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

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


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

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


 




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


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

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