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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2011, 11:29   #1
S@nek
Новичок
Джуниор
 
Регистрация: 16.07.2011
Сообщений: 5
По умолчанию Многопоточность

Всем привет!!!
Помогите пожалуйста исправить ошибку(желательно на примере)

PHP код:
public Thread Potok;

void Motorway(Graphics gr)
        {
            
            
int tr 0;
            while (
tr != 1)
            {
                
gr.Clear(BackColor);
                
gr.DrawRectangle(new Pen(Color.Blue), z607040);
                
Thread.Sleep(100);
            }
        }

private 
void стартToolStripMenuItem_Click(object senderEventArgs e)
        {
            
Graphics gr Graphics.FromHwnd(this.Handle);

            
Potok = new Thread(new ThreadStart(Motorway(gr)));
            
Potok.Start();
        } 
Выдает ошибку: Требуется имя метода

Есть другой вариант
PHP код:
public Thread Potok;

void Motorway()
        {
            
Graphics gr Graphics.FromHwnd(this.Handle);
            
int tr 0;
            while (
tr != 1)
            {
                
gr.Clear(BackColor);
                
gr.DrawRectangle(new Pen(Color.Blue), 500607040);         
                
Thread.Sleep(100);
            }
        }
private 
void стартToolStripMenuItem_Click(object senderEventArgs e)
        {
            
Potok = new Thread(new ThreadStart(Motorway));
            
Potok.Start();
        } 
Выдает ошибку во время выполнения.
S@nek вне форума Ответить с цитированием
Старый 16.07.2011, 11:50   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Надо передать метод без параметра, а параметр передать отдельно.
Carbon вне форума Ответить с цитированием
Старый 16.07.2011, 12:33   #3
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Код:
void ParameterizedThreadStart (object obj);
Guy вне форума Ответить с цитированием
Старый 16.07.2011, 12:46   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Что за ошибка во втором случае? Мы не телепаты.
Carbon вне форума Ответить с цитированием
Старый 16.07.2011, 13:14   #5
S@nek
Новичок
Джуниор
 
Регистрация: 16.07.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Что за ошибка во втором случае? Мы не телепаты.
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "Form1" не из того потока, в котором он был создан.

Graphics gr = Graphics.FromHwnd(this.Handle);
S@nek вне форума Ответить с цитированием
Старый 16.07.2011, 18:05   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от S@nek Посмотреть сообщение
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "Form1" не из того потока, в котором он был создан.

Graphics gr = Graphics.FromHwnd(this.Handle);
Работа с элементами пользовательского интерфейса (в том числе и Form (this)) запрещена из дочерних потоков.

В вашем случае, актуально установить таймер и по обработчику таймера рисовать то, что необходимо. Т.е. потоки в данной ситуации не актуально использовать.

UPD:
Код:
Graphics gr = Graphics.FromHwnd(this.Handle); 
            int tr = 0; 
            while (tr != 1) 
            { 
                gr.Clear(BackColor); 
                gr.DrawRectangle(new Pen(Color.Blue), 500, 60, 70, 40);          
                Thread.Sleep(100); 
            }
1. Какой смысл условия (tr != 1) ? если tr - локальная переменная, т.е. не меняет значения в коде данного потока.
2. Рисование примитивов - это не нагруженная работа для CPU, тем более у вас статичные данные для DrawRectangle, единственное что BackColor видимо где-то меняется.

Решение: как то так
Код:
private void стартToolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            Graphics gr = Graphics.FromHwnd(this.Handle); 
            gr.Clear(BackColor); 
            gr.DrawRectangle(new Pen(Color.Blue), 500, 60, 70, 40); 
            // тут кое что еще
}
так же заглянуть сюда, для рефакторинга кода

Последний раз редактировалось BOBAH13; 16.07.2011 в 18:08.
BOBAH13 вне форума Ответить с цитированием
Старый 16.07.2011, 18:30   #7
S@nek
Новичок
Джуниор
 
Регистрация: 16.07.2011
Сообщений: 5
По умолчанию

Вы меня не так поняли наверно

Последний раз редактировалось S@nek; 16.07.2011 в 18:35.
S@nek вне форума Ответить с цитированием
Старый 16.07.2011, 18:34   #8
S@nek
Новичок
Джуниор
 
Регистрация: 16.07.2011
Сообщений: 5
По умолчанию

Мне нужно сделать бесконечный цикл в отдельном потоке(анимацию), в этом цикле я буду менять переменные и останавливать его меняя tr на 1.(tr будет глобальная переменная).
S@nek вне форума Ответить с цитированием
Старый 16.07.2011, 19:05   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от S@nek Посмотреть сообщение
Мне нужно сделать бесконечный цикл в отдельном потоке(анимацию), в этом цикле я буду менять переменные и останавливать его меняя tr на 1.(tr будет глобальная переменная).
Все равно, читаем внимательно еще раз то, что я вам пытался донести, а именно запрет работы с UI из НЕ главного потока. Для перехода из дочернего потока в главный использовать можно: Control.InvokeRequired и если true, тогда Delegate BeginInvoke (если я не ошибаюсь на счет Windows Forms)
BOBAH13 вне форума Ответить с цитированием
Старый 17.07.2011, 07:20   #10
S@nek
Новичок
Джуниор
 
Регистрация: 16.07.2011
Сообщений: 5
По умолчанию

Вроде немножко разобрался =) Всем огромное спасибо !!!
S@nek вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность nats C# (си шарп) 5 25.06.2011 11:51
Многопоточность и с++ Koshmarovsky Visual C++ 13 06.09.2010 20:39
многопоточность DeDoK Общие вопросы Delphi 6 01.08.2010 02:14
Многопоточность kroŧ Общие вопросы Delphi 5 21.06.2010 10:47
Многопоточность CrazyDude Общие вопросы Delphi 1 18.04.2010 19:00